当前位置: 首页 > news >正文

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转发到具体函数。

 

总结: 

http://www.dtcms.com/a/335073.html

相关文章:

  • Python-Pandas基础
  • 主从复制+哨兵
  • 移动互联网发展战略
  • Altium Designer 22使用笔记(7)---网表导入,叠层设置
  • Spring框架(IOC)
  • 程序设计|C语言教学——C语言基础4:进阶
  • TOGAF八步一法笔记2
  • day42_2025-08-16
  • TDengine 3.3.7.0 版新功能(BLOB 数据类型)
  • ZYNQ QSPI控制器说明
  • JIT 编译与解释执行机制:Java 性能加速的幕后引擎
  • Linux软件编程-线程(2)
  • Python训练营打卡 DAY 38 Dataset和Dataloader类
  • 《代码重生:杨蓉与62.webp》
  • PowerShell中搜索文件夹
  • 国内代理IP在SEO行业中的应用
  • 云安全 - The Big IAM Challenge
  • 低代码平台能力框架:可复用组件与复杂业务的实现机制
  • 现金流预测模型:12个月精准计算指南
  • 嵌入式硬件篇---电感本质
  • Tomcat架构深度解析:从Server到Servlet的全流程揭秘
  • 【数据分享】上市公司供应链成本分摊数据(2007-2024)
  • 使用Python的defaultdict处理字典中的缺失键
  • C++设计模式:面向对象设计原则
  • 肖臻《区块链技术与应用》第20-22讲 - 以太坊难度调整、权益证明和智能合约
  • Java:File类、递归、字符集、IO流体系及Commons-io框架
  • MySQL锁机制:悲观锁VS乐观锁详解
  • 关于“卷积“
  • 《智能体(Agent)速记指南》
  • Linux进程概念(四)环境地址变量