长治市网站建设_网站建设公司_内容更新_seo优化
2025/12/29 17:36:23 网站建设 项目流程

类与设备节点

设备节点是什么?

如果把驱动.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合作生成的成果。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询