c - 使用register_chrdev动态分配主编号时,保留256个次编号有什么意义吗?

标签 c linux

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

    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 数组的大小,结果是 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/

相关文章:

c - 如何在 C 中使用 libevdev 生成键盘输入

linux - 如何将top命令返回的PID值转换成Hex?

将整数转换为 ANSI 字符串

iphone - 使用什么框架从 iPhone 连接到 SQL Server 实例?

c - 为什么 getchar() 函数在循环中工作不同?

c - 警告 C4090 : 'function' : different 'const' qualifiers

c - 如何在 c 中使用 strcat 连接 char 指针?

linux - 如何卸载繁忙的设备

linux - 移动一堆文件时更改所有文件

linux - Bash - 逐行打印句子