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

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

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

 first = MKDEV(MAJOR_NUM, MINOR_NUM); register_chrdev_region(first, count, DEVICE_NAME);//ops= &fops; mycdev->owner = THIS_MODULE; if (cdev_add(mycdev,first, count) == 0) {printk(KERN_ALERT "driver loaded\n");} 

我注释掉了register_chrdev_region(first, count, DEVICE_NAME);register_chrdev_region(first, count, DEVICE_NAME);printk消息仍然出现。 我试图在有或没有用户空间的情况下与驱动程序通信,两者都是成功的。

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

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

谢谢!

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

无论您是根据需要静态还是动态地执行此操作,都应该采取措施避免与规则可能已播放的其他设备驱动程序发生冲突并分配您尝试使用的数字。 即使您的驾驶员在没有它的情况下完美运行,但在每台机器上或将来的任何时间都不一定如此。

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

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

如果设备的主设备号码与已使用的任何其他设备发生冲突,则驱动程序将无法完成分配。

如果您已经测试了哪个主要编号是免费的并且使用它,它通常不会引发错误,并且您在加载驱动程序时将面临没有问题。

但是,如果您在各种系统上运行,并且主要数字已被某些其他系统捕获并使用。那么您的驱动程序加载可能会失败。

它总是更好地使用动态分配!!