3

使用 register_chrdev 函数为动态分配的主要号码分配 256 个次要号码是否有意义

  1. 要动态分配主编号,我使用内核中定义的 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);
    }
    
  2. __register_chrdev 现在将分配一个动态主编号,如果作为参数传递的主值是 0。此特定操作在内核中有以下源代码

    if (major == 0) {
            for (i = ARRAY_SIZE(chrdevs)-1; i > 0; i--) {
                    if (chrdevs[i] == NULL)
                    break;
            }
    
  3. chrdev 是指向 struct char_device_struct *chrdevs[CHRDEV_MAJOR_HASH_SIZE] 的指针数组;

  4. 宏 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

4

1 回答 1

1

Register_chrdev 是旧接口,默认提供 256 个未成年人。这是从较旧的内核中携带的,并为向后兼容而维护。在 2.6 以后的新内核中,您有 register_chrdev_region 或 alloc_chrdev_region 。在此您可以指定您需要的未成年人数量。这是比 register_chrdev 更好的接口。

于 2013-04-06T17:42:22.277 回答