2011-11-24 76 views
9

我正在学习使用register_chrdev_region(dev_t from, unsigned count, const char * name);注册一个内核模块。关于register_chrdev_region()在linux设备驱动程序的问题

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

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消息仍然出现了。我尝试与用户空间中的驱动程序进行通信,并且都是成功的。

所以我的问题是,这个功能​​只用于使我的驱动程序成为一个好的核心公民,就像告诉别人“我用尽主要号码,请不要使用”?

我试图看看内核源代码char_dev.c来了解这个函数,但是我发现它很难理解,熟悉这个的任何人?

谢谢!

回答

8

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

无论你做静态前面或根据需要动态地,它东西,你应该做的,以避免与可能的规则发挥和被分配你想使用的号码其他设备驱动程序冲突。即使没有它,你的驱动程序也能很好地工作,但在每台机器上或将来的任何时候都不一定是这样。

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

请参阅here了解有关设置过程的更多详情。

1

如果您的设备的主号码与任何其他正在使用的设备发生冲突,则驱动程序将不会完成分配。

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

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

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

相关问题