news 2026/6/10 15:16:10

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/5/17 8:58:14

PyTorch Dropout层防止过拟合机制解析

PyTorch Dropout层防止过拟合机制解析 在深度学习的实际项目中&#xff0c;一个常见而棘手的问题是&#xff1a;模型在训练集上表现优异&#xff0c;准确率节节攀升&#xff0c;但一到测试数据或真实场景中就“掉链子”——这种现象正是过拟合&#xff08;Overfitting&#xff…

作者头像 李华
网站建设 2026/6/6 3:12:00

Conda update升级PyTorch及相关依赖包

Conda update升级PyTorch及相关依赖包 在深度学习项目开发中&#xff0c;最让人头疼的往往不是模型调参&#xff0c;而是环境配置——“为什么代码在我机器上跑得好好的&#xff0c;换台设备就报错&#xff1f;”这种问题几乎每个AI工程师都经历过。尤其当涉及到GPU加速、CUDA…

作者头像 李华
网站建设 2026/6/7 18:17:21

Anaconda停用base环境自动激活

Anaconda停用base环境自动激活 在构建AI开发环境时&#xff0c;你是否曾被终端一打开就自动进入 (base) 的提示困扰&#xff1f;这个看似贴心的设计&#xff0c;在真实项目中反而成了“隐形陷阱”。尤其是在使用 PyTorch-CUDA 容器镜像进行模型训练时&#xff0c;一个未经控制的…

作者头像 李华
网站建设 2026/6/9 22:54:55

出口欧盟的产品为什么做CE认证?

出口欧盟的产品办理CE 认证&#xff0c;是产品合法进入欧盟市场流通、销售的强制性合规要求&#xff0c;核心目的是保障欧盟市场内的产品安全、健康、环保标准统一&#xff0c;同时消除成员国之间的贸易壁垒&#xff0c;具体原因和作用如下&#xff1a;欧盟市场准入的法定门槛欧…

作者头像 李华