当前位置: 首页 > 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.lryc.cn/news/623336.html

相关文章:

  • 链式二叉树的基本操作——遍历
  • 【论文笔记】Multi-Agent Based Character Simulation for Story Writing
  • 同创物流学习记录2·电车
  • 聊聊智慧这个东西之三:从食物的毒性、偏性聊起
  • 探秘gRPC——gRPC原理详解
  • [优选算法专题二滑动窗口——最大连续1的个数 III]
  • implement libwhich for Windows
  • Azure AI Search 探索总结
  • 软考 系统架构设计师系列知识点之杂项集萃(124)
  • [Responsive theme color] 动态主题 | 色彩工具函数 | HEX与RGB
  • OpenStack Neutron中的L2 Agent与L3 Agent:新手友好指南
  • SpringSecurity(一)入门
  • DAY12DAY13-新世纪DL(Deeplearning/深度学习)战士:破(改善神经网络)1
  • tree组件(几种不同分叉树Vue3)
  • ubuntu网络共享
  • JetPack系列教程(七):Palette——让你的APP色彩“飞”起来!
  • NLP:Transformer模型构建
  • 【遥感图像技术系列】遥感图像风格迁移的研究进展一览
  • Win10快速安装.NET3.5
  • 排列与组合
  • React单元测试
  • 云安全 - The Big IAM Challenge
  • XSS攻击:从原理入门到实战精通详解
  • JCTools 无锁并发队列基础:ConcurrentCircularArrayQueue
  • 深入解析C++ STL链表(List)模拟实现
  • 如何得知是Counter.razor通过HTTP回调处理的还是WASM处理的,怎么检测?
  • 基于Python的电影评论数据分析系统 Python+Django+Vue.js
  • qt vs2019编译QXlsx
  • Qt QDateTime时间部分显示为全0,QTime赋值后显示无效问题【已解决】
  • ML307C 4G通信板:工业级DTU固件,多协议支持,智能配置管理