我想在注册内核模块时遵循最佳实践并为我的驱动程序使用动态主要编号分配。
我可以用printk输出这个数字,然后用dmesg查看。但是可以使用ioctl应用程序检索这样的数字,用于与驱动程序通信吗?
或者perhaphs可以写一些shell脚本,它将执行insmod,mknod&还检索给定的主号码?
答案 0 :(得分:1)
通常通过读取/ proc / devices我们可以获得动态分配的主编号。
awk '$2=="misc" {print $1}' /proc/devices
这里" misc"是驱动程序名称。
写一个返回主要数字的额外函数没有坏处。
答案 1 :(得分:0)
我假设您有一个静态/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)")");
然后在使用major
或其他任何内容注册您的设备时使用register_chrdev
的值。注册设备后,如果major
为0
,请将其设置为实际的动态分配的主设备号,以便您可以通过sysfs模块参数文件将其读回。
从用户空间,模块参数文件将类似/sys/module/mydriver/parameters/major
,并将主要设备编号包含为十进制字符串。您可以在脚本中阅读该内容,并将其与mknod
程序一起使用以创建设备文件。
虽然使用动态/dev
更容易!
答案 2 :(得分:0)
您需要使用函数 alloc_chrdev_region
。
见https://www.kernel.org/doc/htmldocs/kernel-api/API-alloc-chrdev-region.html