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

相关文章:

  • Python代码规范与静态检查(ruff/black/mypy + pyproject.toml + Makefile)自动化工具链介绍
  • 【LeetCode 热题 100】70. 爬楼梯——(解法二)自底向上
  • 在鸿蒙应用中快速接入地图功能:从配置到实战案例全解析
  • ISO27001 高阶架构 之 支持 -2
  • PHP域名授权系统网站源码/授权管理工单系统/精美UI/附教程
  • 广东省省考备考(第七十八天8.16)——资料分析、判断推理(强化训练)
  • Spring AMQP如何通过配置文件避免硬编码实现解耦
  • Linux -- 文件【下】
  • 深度解析和鲸社区热门项目:电商双 11 美妆数据分析的细节与价值
  • 41 C++ STL模板库10-容器3-list
  • 正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
  • docker-compose-mysql-定时备份数据库到其他服务器脚本
  • 【机器学习深度学习】OpenCompass:支持的开源评估数据集及使用差异
  • RemoteCtrl-初步的网络编程框架搭建
  • 安全审计-firewall防火墙
  • 算法训练营day52 图论③ 101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿
  • 基于Uni-app+vue3实现微信小程序地图固定中心点范围内拖拽选择位置功能(分步骤详解)
  • MySQL 配置性能优化赛技术文章
  • 基于Python3.10.6与jieba库的中文分词模型接口在Windows Server 2022上的实现与部署教程
  • Flutter开发 网络请求
  • ESP32-S3_ES8311音频输出使用
  • 【嵌入式C语言】六
  • 【读论文】医疗AI大模型:百川开源Baichuan-M2
  • 第二十五天:构造函数/析构函数/拷贝构造
  • 开发一款多商户电商APP要多久?功能拆解与源码技术落地方案
  • 迭代器模式及优化
  • 模式匹配自动机全面理论分析
  • 【Web后端】Django、flask及其场景——以构建系统原型为例
  • AI 搜索时代:引领变革,重塑您的 SEO 战略
  • 基于uni-app+vue3实现的微信小程序地图范围限制与单点标记功能实现指南