我正在写一个内核模块。我可以轻松地在 /dev/ 中创建一个字符设备,但我想要3台设备可供我的用户使用,最好将它们全部放在一个/dev/ 子目录。
可能的示例(存在于我的 openSUSE 盒子上):
# ls -l /dev/bsg
total 0
crw-rw---- 1 root root 252, 0 Jul 17 14:28 0:0:0:0
crw-rw---- 1 root root 252, 1 Jul 17 14:28 0:0:1:0
crw-rw---- 1 root root 252, 2 Jul 17 14:28 0:0:2:0
crw-rw---- 1 root root 252, 3 Jul 17 14:28 0:0:3:0
crw-rw---- 1 root root 252, 4 Jul 17 14:28 0:0:4:0
crw-rw---- 1 root root 252, 5 Jul 17 14:28 1:0:0:0
(我已经查看了 bsg.c 代码,但不知道字符设备添加到什么“父级”)。
我怎样才能做类似的事情?
答案1
我找到了一种适合我的方法,一种不使用 udev 规则的方法(我宁愿以编程方式执行)。这比我之前想象的要容易。
alloc_chrdev_region
对于设备数量。- 为每个设备创建类(每个类具有不同的名称)
- 使用自定义函数设置类的
devnode
字段,例如:return kasprintf(GFP_KERNEL, "name/%d", global++);
。这就是命名发生的地方。 Udev 应该尊重这个功能。 - 使用
cdev_init
&&创建 cdevcdev_add
并设置它们的 fops。 - 创建设备
device_create
(父级为 NULL)
请注意,这里没有设备层次结构,只是碰巧位于同一 /dev/ 目录中的独立设备。步骤 2-5 中指定的名称最终将位于 /sys/ 中。