linux设备驱动之字符设备驱动

一、cdev结构体

成员/功能说明相关操作函数/宏
kobj内嵌的kobject对象,用于Linux设备模型管理,实现引用计数和sysfs接口kobject_init()
owner指向拥有该结构体的模块指针(通常为THIS_MODULE),防止模块卸载时设备仍被使用模块宏THIS_MODULE
ops指向file_operations结构体的指针,定义设备操作接口(如read/writecdev_init()初始化时绑定
list链表头,用于将多个cdev连接成链表,由内核统一管理list_add()等内核链表操作
dev设备号(32位),高12位为主设备号,低20位为次设备号MKDEV()MAJOR()MINOR()
count设备实例数量(如一个驱动管理多个同类设备)注册时通过cdev_add()count参数指定
初始化函数cdev_init():关联cdevfile_operationscdev_alloc():动态分配cdev内存cdev_init(struct cdev *, struct file_operations *)
注册/注销函数cdev_add():向内核注册设备;cdev_del():注销设备需配合register_chrdev_region()alloc_chrdev_region()使用
设备号管理register_chrdev_region():已知设备号时注册;alloc_chrdev_region():动态申请未占用设备号释放设备号需调用unregister_chrdev_region()

 二、字符设备驱动的组成

组件功能描述关键数据结构/API开发注意事项
设备号管理标识设备实例(主设备号区分驱动,次设备号区分实例)dev_t类型、MKDEV()/MAJOR()/MINOR()宏、register_chrdev_region()或动态分配alloc_chrdev_region()48需避免直接操作设备号位宽,使用内核宏保证兼容性4
cdev结构体内核中描述字符设备的核心对象,关联操作方法与设备号struct cdev(含kobjopsdev等成员)、cdev_init()初始化、cdev_add()注册58需通过cdev_del()注销防止内存泄漏8
file_operations定义设备操作接口(如open/read/write/ioctlstruct file_operations(需实现至少ownerreadwrite等函数指针)35用户空间数据交互需使用copy_{to,from}_user()保证安全23
设备文件节点用户空间访问设备的入口(如/dev/xxx手动mknod或自动生成(class_create()+device_create())18推荐自动生成节点以适配现代内核1
模块初始化/退出驱动加载/卸载时的资源管理module_init()/module_exit()宏、资源释放函数(如unregister_chrdev_region())12必须实现清理逻辑防止残留2
同步机制处理多进程/线程并发访问mutex_lock()spin_lock()等内核同步原语7需根据场景选择锁类型(如互斥锁适合长时间持有)7
调试与日志驱动调试信息输出printk()分级日志、dynamic_debug动态调试3生产环境需控制日志级别3

注意:

  1. 完整驱动流程‌:设备号申请 → cdev初始化 → 实现file_operations → 注册设备 → 创建设备节点。
  2. 用户空间交互‌:通过/dev/下的文件节点调用驱动接口,内核通过file_operations转发到具体函数。

 

总结: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值