使用 register_chrdev 函数为动态分配的主要号码分配 256 个次要号码是否有意义
要动态分配主编号,我使用内核中定义的 register_chrdev 函数
static inline int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops) { return __register_chrdev(major, 0, 256, name, fops); }
__register_chrdev 现在将分配一个动态主编号,如果作为参数传递的主值是 0。此特定操作在内核中有以下源代码
if (major == 0) { for (i = ARRAY_SIZE(chrdevs)-1; i > 0; i--) { if (chrdevs[i] == NULL) break; }
chrdev 是指向 struct char_device_struct *chrdevs[CHRDEV_MAJOR_HASH_SIZE] 的指针数组;
宏 CHRDEV_MAJOR_HASH_SIZE 的大小为 255
5.ARRAY_SIZE(chrdevs) 将返回 *chrdevs 数组的大小,考虑到 struct char_device_struct 的大小为 84 字节,结果为 5334(请原谅我的错误数学计算)。
问题:这很可能是一个愚蠢的问题,但为什么自动分配 256 个次要编号有什么意义吗?
以上截取的源代码来自 linux-3.6.7 内核文件:fs/char_dev.c