news 2026/1/13 8:18:30

Linux驱动-类与设备节点

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux驱动-类与设备节点

类与设备节点

设备节点是什么?

如果把驱动.ko认为是普通应用程序,那么设备节点/dev/xxx就是该应用程序的启动链接。

  • 内核中单有驱动.ko,没有启动链接,无法启动,该驱动程序无用。
  • 单有/dev/xxx,没有驱动的话,你cat /dev/xxx,系统报错cat: /dev/test: 没有那个设备或地址,cat其实会调用open这样的函数。

在比较原始驱动中的,如果没有udev/mdev机制(即没有自动创建设备节点)。insmod xxx.ko后你可以在/proc/devices中看到主设备号,和对应驱动名称,但无法在/dev/xxx看到对应设备。

如何创建和删除设备节点与类

手动创建
mknod/dev/led c2500

其中dev/led 为设备节点 ,c 代表字符设备, 250代表主设备号, 0代表次设备号。
主设备号:可以从/proc/devices查询到,你要使用的设备的主设备号。
次设备号:标识具体的设备实例

手动删除rm -f /dev/xxx

使用udev/mdev自动创建
  1. 创建设备类struct class *class_create (struct module *owner, const char *name)
    1. 参数 owner 一般为 THIS_MODULE
    2. 参数 name 是类名字。
    3. 返回值是个指向结构体 class 的指针,也就是创建的类。
  2. 创建设备节点
structdevice*device_create(structclass*class,structdevice*parent,dev_tdevt,void*drvdata,constchar*fmt,...)
  • class:设备要创建到哪个类下面
  • parnet:父设备一般为,NULL
  • devt:设备号
  • drvdata:设备可能会用到的一些数据
  • *fmt, ...:
    • fmt: 格式化控制字符串(比如"mydev%d")。
    • ...: 填充格式化字符串的具体变量。
    • 假设你有一个驱动程序管理着 4 个相同的硬件端口,你想在/dev/下生成mydev0mydev3。你可以这样写:
for(inti=0;i<4;i++){device_create(my_class,NULL,MKDEV(major,i),NULL,"mydev%d",i);}
  1. 记得moudel_exit()时,记得销毁设备节点和设备类。void class_destroy(struct class *cls);void device_destroy(struct class *class, dev_t devt)

类与设备节点的关系

没有class,手动创建的设备节点也可以用。udev机制在创建设备节点前,必须要有类。目前不清楚为什么这样。类应该是有关键作用,只是目前我尚不清楚。现代系统推荐采用udev机制。

驱动程序.ko与设备节点的关系

用户程序||open("/dev/chrdevbase")|/dev/chrdevbase(200:0)||查主设备号|chrdevbase.ko||file_operations|chrdevbase_open/read/write

模块名,驱动名,类名,设备节点名

这四个名字完全不一样

1. 模块名 (Module Name)
  • 对应你代码:编译生成的文件名(如chrdevbase.ko)。
  • 在哪里看:lsmod命令。
  • 用途:管理.ko文件的加载和卸载。当你执行rmmod xxx时,内核找的就是这个名字。
  • 关联:通常由 Makefile 中的obj-m := chrdevbase.o决定,一般会等于文件名。
2. 驱动名 (Driver Name)
  • 对应你代码:register_chrdev(major, "mychrdriver", &fops)中的第二个参数。
  • 在哪里看:cat /proc/devices
  • 用途:内核内部登记。它是给内核看的,用来标识这个主设备号被哪个驱动占用了。它不直接影响/dev下的文件名。
3. 类名 (Class Name)
  • 对应你代码:class_create(THIS_MODULE, "mychrclass")中的第二个参数。
  • 在哪里看:/sys/class/目录。
  • 用途:逻辑分类。它把具有相同功能的设备(如所有的 LED、所有的串口)归为一类。在/sys/class/mychrclass/下,你可以找到属于这个类的所有设备。
4. 设备节点名 (Device Node Name)
  • 对应你代码:device_create(..., "mychrdevices")中的最后一个参数。
  • 在哪里看:/dev/目录。
  • 用途:用户空间的“入口”。这是应用层open("/dev/mychrdevices", ...)时真正使用的字符串。
  • 关联:这是类(Class)和udev合作生成的成果。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/5 23:56:15

java计算机毕业设计校园闲置交易系统 高校跳蚤市场智能交易平台 校园绿色循环物品交换系统

计算机毕业设计校园闲置交易系统245z09&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。 毕业季搬家季&#xff0c;楼道里成堆的台灯、教材、球拍、小风扇眼看就要被宿管扔进垃圾桶…

作者头像 李华
网站建设 2026/1/4 19:56:55

Git remote管理远程PyTorch仓库地址

Git Remote 与 PyTorch-CUDA 环境协同实践&#xff1a;构建高效 AI 开发流水线 在深度学习项目中&#xff0c;你是否经历过这样的场景&#xff1f;模型在本地训练完美&#xff0c;部署时却因环境差异报错&#xff1b;团队成员提交的代码版本混乱&#xff0c;合并冲突频发&#…

作者头像 李华
网站建设 2026/1/10 6:53:24

JavaScript性能优化实战技术文章大纲

性能优化的核心原则减少不必要的计算和渲染优化资源加载和执行顺序合理利用缓存机制避免内存泄漏和过度消耗代码层面的优化策略避免全局变量污染&#xff0c;使用模块化开发减少DOM操作&#xff0c;批量处理DOM更新使用事件委托替代大量事件监听优化循环和递归的性能合理使用节…

作者头像 李华
网站建设 2026/1/7 20:09:02

大模型Prompt工程:解决AI输出不稳定问题的终极方法

文章介绍了大模型Prompt工程的方法论&#xff0c;指出模型越强提示词越难写的根本原因在于模型不会理解意图只会预测最可能结果。提出"五段式Prompt工程模型"&#xff1a;角色、目标、输入、过程、输出&#xff0c;并强调结构化、上下文完整和任务拆分的重要性。同时…

作者头像 李华
网站建设 2026/1/3 11:01:26

CCC认证的流程是什么?需要哪些资料?

CCC 认证是中国强制性产品认证&#xff0c;适用于目录内产品的境内销售与进口清关&#xff0c;核心流程为 “目录判定→申请受理→型式试验→初始工厂检查→评定发证→获证后监督”&#xff0c;证书有效期通常 5 年&#xff0c;需按规定加贴 CCC 标志并接受年度监督。标准流程&…

作者头像 李华