关于Linux设备驱动中register_chrdev_region()函数的问题

9

我正在学习使用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个回答

8
那样做是可行的,因为实际上没有必要预先分配设备号。事实上,许多内核开发人员认为使用动态(按需)分配函数alloc_chrdev_region更好。
无论您是静态地预先分配还是根据需要动态分配,这都是为了避免与其他设备驱动程序冲突而应该做的事情,这些驱动程序可能已经按规则分配了您正在尝试使用的编号。即使您的驱动程序在没有它的情况下完美运行,也不一定在每台机器或未来的任何时候都是如此。
规则存在是有原因的,特别是对于低级别的东西,建议您遵循它们。
有关设置过程的更多详细信息,请参见此处

1
如果您的设备的主要编号与已经使用的任何其他设备冲突,那么驱动程序将无法完成分配。
如果您已经测试了哪个主要编号是空闲的并使用了它,通常不会出现错误,并且在加载驱动程序时您将面临没有问题。
但是,如果您在各种系统上运行,并且该主要编号已被某个其他系统占用和使用,则您的驱动程序加载可能会失败。
最好始终使用动态分配!!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接