【发布时间】:2016-05-02 18:52:48
【问题描述】:
我想在注册内核模块时遵循最佳实践并为我的驱动程序使用动态主号码分配。
我可以用 printk 输出这个数字并用 dmesg 看到它。但是是否可以使用用于与驱动程序对话的 ioctl 应用程序检索这样的数字?
或者也许可以编写一些 shell 脚本来执行 insmod、mknod 并检索给定的主编号?
【问题讨论】:
标签: linux-device-driver kernel-module ioctl
我想在注册内核模块时遵循最佳实践并为我的驱动程序使用动态主号码分配。
我可以用 printk 输出这个数字并用 dmesg 看到它。但是是否可以使用用于与驱动程序对话的 ioctl 应用程序检索这样的数字?
或者也许可以编写一些 shell 脚本来执行 insmod、mknod 并检索给定的主编号?
【问题讨论】:
标签: linux-device-driver kernel-module ioctl
通常通过读取 /proc/devices 我们可以获得动态分配的主要编号。
awk '$2=="misc" {print $1}' /proc/devices
这里的“misc”是驱动程序名称。
编写一个返回主编号的额外函数没有害处。
【讨论】:
我假设您有一个静态的 /dev 目录,否则您可以让设备文件使用正确的主要和次要设备号动态创建并完成。
如果您在/sys 上安装了 sysfs,您可以添加一个只读模块参数来指示注册到您的设备的主要设备号。 (如果您将驱动程序作为模块加载,您还可以在加载模块时使用相同的模块参数设置特定的主设备号,默认为动态分配的主设备号。要将这样的模块参数添加到驱动程序,您可以这样做:
#define MYDRIVER_MAJOR_DEF 0 /* Default major is dynamic */
unsigned int major = MYDRIVER_MAJOR_DEF;
module_param(major, uint, 0444);
MODULE_PARM_DESC(major,
"Major device number; set to 0 to assign dynamically;"
" (default="__MODULE_STRING(MYDRIVER_MAJOR_DEF)")");
然后在使用register_chrdev 或其他方式注册您的设备时使用major 的值。注册设备后,如果major 是0,请将其设置为实际动态分配的主设备号,以便您可以通过 sysfs 模块参数文件读回它。
从用户空间,模块参数文件将类似于/sys/module/mydriver/parameters/major,并将包含主要设备号作为十进制字符串。您可以在脚本中阅读它并将其与mknod 程序一起使用来创建设备文件。
不过,使用动态 /dev 更容易!
【讨论】:
modprobe mydriver major=240的东西。
你需要使用函数alloc_chrdev_region。
见https://www.kernel.org/doc/htmldocs/kernel-api/API-alloc-chrdev-region.html
【讨论】: