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

时间:2011-11-24 07:20:41

标签: c linux-kernel linux-device-driver

我正在学习使用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来理解这个功能,但是我发现它太难理解了,有人熟悉这个吗?

谢谢!

2 个答案:

答案 0 :(得分:8)

这样可行,因为事先并不需要必要来分配你的设备号码。事实上,许多内核开发人员认为使用动态(动态,按需)分配函数alloc_chrdev_region是合适的。

无论你是预先静态还是动态地根据需要进行操作,你应该做的事情,以避免与规则所扮演的其他设备驱动程序发生冲突,并为你分配数字试图使用。即使你的司机在没有它的情况下运作得很好,但在每台机器上或将来的任何时候都不一定如此。

规则是有原因的,特别是对于低级别的东西,建议您遵循它们。

有关设置过程的详细信息,请参阅here

答案 1 :(得分:1)

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

如果您已经测试了哪个主要号码是免费的并且使用过它,它通常不会引发错误,并且您在加载驱动程序时不会遇到任何问题。

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

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