手动执行mknod时如何获取驱动模块的主次设备号?
获取编译进内核的驱动主次设备号的几种方法
嘿,这个场景我太熟悉了——把驱动编译进内核后,找不到设备号没法创节点对吧?给你几个实用的办法:
查看内核启动日志(dmesg)
大多数驱动在注册字符/块设备的时候,都会把主次设备号打印到内核日志里。你可以直接过滤关键信息:dmesg | grep -E "major|minor|device number"或者更精准一点,搜你的驱动名称:
dmesg | grep "你的驱动模块名称"通常会看到类似
[xxx] my_driver: registered with major 238, minor range 0-7这样的输出,直接就能拿到你要的数字。查看
/proc/devices文件
这个文件是内核维护的已注册设备清单,里面会列出所有字符设备(Character devices)和块设备(Block devices)的主设备号,以及对应的设备名称。执行:cat /proc/devices找到你的驱动对应的名称,前面的数字就是主设备号。如果你的驱动是动态分配次设备号的,次设备号的范围一般会在dmesg日志里,或者你可以参考驱动代码里的设置(比如从0开始的连续编号)。
检查驱动源代码
毕竟是你自己写的驱动,代码里肯定有设备号的定义逻辑:- 如果是静态指定的,代码里会有类似
#define MY_DRIVER_MAJOR 240或者在register_chrdev_region()里直接写死主设备号的代码; - 如果是动态申请的(用
alloc_chrdev_region()),内核会自动分配可用的主设备号,这时候就只能靠前面两种方法来查实际分配的数值了。
- 如果是静态指定的,代码里会有类似
内容的提问来源于stack exchange,提问作者julien




