使用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); }
如果作为参数传递的主要值为 0,__register_chrdev 现在将分配一个动态主要编号。此特定操作在内核中具有以下源代码
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 数组的大小,结果是 5334(请原谅我错误的数学计算)考虑到 struct char_device_struct 的大小是 84 字节。
问题:这很可能是一个愚蠢的问题,但是为什么会自动分配 256 个次要号码有什么意义吗?
上面截取的源代码来自 linux-3.6.7 内核 文件:fs/char_dev.c
最佳答案
register_chrdev 是较旧的接口(interface),用于默认提供 256 个未成年人。 这是从旧内核携带的,并为向后兼容而维护。 在 2.6 及更高版本的新内核中,您有 register_chrdev_region 或 alloc_chrdev_region。 在此您可以指定所需的未成年人数量。 这是比 register_chrdev 更好用的接口(interface)。
关于c - 使用register_chrdev动态分配主编号时,保留256个次编号有什么意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15853931/