尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

三、字符设备驱动(基于北京迅为电子)

三、字符设备驱动(基于北京迅为电子)
📅 发布时间:2026/6/20 19:39:22

一、概述

字符设备的驱动包括设备号、字符设备结构体、自动创建设备节点、fops结构体

二、知识点

  1. 设备号:一个32bit的数据,高12bit表示主设备号,低20bit表示次设备号
  2. 宏定义:MAJOR(dev),MINOR(dev),MKDEV(ma,mi)
  3. 分配设备号:register_chrdev_region、alloc_chrdev_region前者静态分配设备号,后者动态分配设备号
  4. cat /proc/devices 查看已经分配的设备号
  5. 分配设备号
register_chrdev_region(dev_t, unsigned, const char*);      // 起始设备号、数量、名称
alloc_chrdev_region(dev_t*, unsigned, unsigned, const char*);  // 保存申请到的设备号、起始次设备号、数量、名称
unregister_chrdev_region(dev_t, unsigned);                // 要释放的设备号、要释放的设备号的数量
  1. 注册一个字符设备
struct cdev {struct kobject kobj;                    // 父对象struct module *owner;                   // 所有者const struct file_operations *ops;      // fopsstruct list_head list;                  // 链表头dev_t dev;                              // 设备号unsigned int count;                     // 数量
} __randomize_layout;
void cdev_init(struct cdev *, const struct file_operations *);        // 初始化cdev结构体并关联fops
int cdev_add(struct cdev *, dev_t, unsigned);        // 关联设备号和数量,并注册cdev
void cdev_del(struct cdev *);                        // 注销cdev    
  1. 文件操作函数结构体
struct file_operations ;
应用层的open、read、write、close、ioctl函数均有驱动层的相应函数对应,这些函数指针都放在file_operation结构体中
  1. 创建设备节点
手动创建设备节点 mknod /dev/xxx c 250 0
struct class *cls = class_create(owner, name);
void class_destroy(struct class *cls);
device_create(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...);
void device_destroy(struct class *cls, dev_t devt);
  1. 用户空间和内核空间
    通过系统调用、软中断、硬件中断,进程由用户空间陷入内核空间。两个空间拷贝数据的API:copy_from_user和copy_to_user
  2. file结构体的私有数据,一般驱动空间中会由一个自定义的结构体,这样在open时设置file的private_data为该结构体实例对象的指针,在后续的read/write函数中通过访问file的private_data就可以得到有用数据
  3. container_of(type, struct, name); 通过结构体成员的地址得到结构体的地址
  4. 错误处理:使用goto完成不同阶段的错误处理退出,使用IS_ERR判断指针是否有效,通过PTR_TO_ERR将错误指针返回错误

三、杂项设备

  1. 杂项设备是无法归类的一系列设备,主设备号都是10,用来避免主设备号的浪费
  2. 杂项设备不需要手动设置设备节点,实现相应的miscdevice结构体,填充name、minor和fops即可(minor使用MISC_DYNAMIC_MINOR表示动态申请次设备号)
  3. 实现miscdevice结构体之后,调用misc_register就可以注册一个杂项设备并自动生成设备节点
  4. 调用misc_unregister注销杂项设备

四、字符设备的驱动框架

  1. 定义cdev结构体
  2. 动态分配一个设备号alloc_chrdev_region
  3. 初始化cdev结构体并添加到系统中cdev_init cdev_add
  4. 设置自动创建设备节点class_create device_create
  5. cdev_init时需要传入fops,因此需要实现fops的几个函数,open、read、write等等
  6. 出口函数中需要反过来一步一步地注销

相关新闻

  • Zabbix告警:value cache working in low memory mode
  • 计算机导论
  • 出海 AI 公司招 Java 大佬|北京

最新新闻

  • R3nzSkin国服换肤工具完整指南:内存级皮肤修改实战应用
  • 2026无锡黄金回收商户权威排名 本地闲置黄金变现避雷手册 - 资讯速览
  • 如何免费解锁九大网盘高速下载:网盘直链下载助手终极指南
  • IPXWrapper终极指南:3步让经典游戏在Windows 11上重获联机能力
  • 3步激活Adobe全家桶:Adobe-GenP破解工具的智能化解决方案
  • IPXWrapper:让经典游戏在Windows 11重获联机生命的终极方案

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号