关于linux设备驱动程序中的register_chrdev_region()的问题

I'm*_*gon 9 c linux-device-driver linux-kernel

我正在学习使用内核模块的注册register_chrdev_region(dev_t from, unsigned count, const char * name);.

我注意到有或没有这个函数,我的内核模块按预期工作.我用来测试的代码:

first = MKDEV(MAJOR_NUM, MINOR_NUM);
register_chrdev_region(first, count, DEVICE_NAME);//<---with and without

mycdev=cdev_alloc();
mycdev->ops= &fops;
mycdev->owner = THIS_MODULE;

if (cdev_add(mycdev,first, count) == 0)
{printk(KERN_ALERT "driver loaded\n");}
Run Code Online (Sandbox Code Playgroud)

我评论了这一行register_chrdev_region(first, count, DEVICE_NAME);,printk消息仍然出现.我试图在有或没有用户空间的情况下与驱动程序通信,并且两者都是成功的.

所以我的问题是,这个函数register_chrdev_region()是用来让我的驱动程序成为一个好的内核公民,就像告诉其他人"我用完主要数字,请不要使用"?

我试着看一下内核源代码char_dev.c来理解这个函数,但是我发现它太难理解了,有人熟悉这个吗?

谢谢!

pax*_*blo 8

这样可行,因为实际上并不需要预先分配您的设备号.实际上,许多内核开发人员认为使用动态(动态,按需)分配函数是更可取的alloc_chrdev_region.

无论你做静态前面或根据需要动态地,这你应该做的,以避免与可能的规则发挥和被分配你想使用的号码其他设备驱动程序冲突.即使您的驾驶员在没有它的情况下完美运行,但在每台机器上或将来的任何时间都不一定如此.

这些规则是有原因的,特别是对于低级别的东西,建议您遵循这些规则.

有关设置过程的详细信息,请参见此处.