我正在学习使用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");}
我注释了register_chrdev_region(first, count, DEVICE_NAME);
行,printk
消息仍然出现。我试图在有或没有用户空间的情况下与驱动程序通信,并且两者都是成功的。
所以我的问题是,这个函数register_chrdev_region()
是否仅用于使我的驱动程序成为一个好的内核公民,就像告诉其他人“我用完主要数字,请不要使用”?
我试着看一下内核源代码char_dev.c
来理解这个功能,但是我发现它太难理解了,有人熟悉这个吗?
谢谢!
答案 0 :(得分:8)
这样可行,因为事先并不需要必要来分配你的设备号码。事实上,许多内核开发人员认为使用动态(动态,按需)分配函数alloc_chrdev_region
是合适的。
无论你是预先静态还是动态地根据需要进行操作,是你应该做的事情,以避免与规则所扮演的其他设备驱动程序发生冲突,并为你分配数字试图使用。即使你的司机在没有它的情况下运作得很好,但在每台机器上或将来的任何时候都不一定如此。
规则是有原因的,特别是对于低级别的东西,建议您遵循它们。
有关设置过程的详细信息,请参阅here。
答案 1 :(得分:1)
如果您的设备的主号码与已使用的任何其他设备发生冲突,则驱动程序无法完成分配。
如果您已经测试了哪个主要号码是免费的并且使用过它,它通常不会引发错误,并且您在加载驱动程序时不会遇到任何问题。
但是如果你在各种系统上运行,并且主要号码已被某些其他系统捕获并使用。那么你的驱动程序加载可能会失败。
使用动态分配总是更好!!