find_dynamic_major函数

时间:2018-09-26 06:20:21

标签: linux-kernel

内核版本v4.14 rc1引入了功能find_dynamic_major。在v4.19 rc5中,此功能的版本为:

static int find_dynamic_major(void)
{
int i;
struct char_device_struct *cd;

for (i = ARRAY_SIZE(chrdevs)-1; i >= CHRDEV_MAJOR_DYN_END; i--) {
    if (chrdevs[i] == NULL)
        return i;
}

for (i = CHRDEV_MAJOR_DYN_EXT_START;
     i > CHRDEV_MAJOR_DYN_EXT_END; i--) {
    for (cd = chrdevs[major_to_index(i)]; cd; cd = cd->next)
        if (cd->major == i)
            break;

    if (cd == NULL || cd->major != i)
        return i;
}

return -EBUSY;
}

具有以下值:

  • ARRAY_SIZE(chrdevs) = 255

  • CHRDEV_MAJOR_DYN_END = 234

  • CHRDEV_MAJOR_DYN_EXT_START = 511

  • CHRDEV_MAJOR_DYN_EXT_END = 384

在第一部分中,该函数遍历254和234之间的所有主数。已验证的数组位置从254到234。在第二部分中,该函数遍历511和384之间的所有主数。 {1}}仅返回i%255,因此第二个函数将验证数组位置从511%255(即1)到384%255(即129)。我的问题是,为什么不验证130和233之间的位置?在引入此功能之前,为了找到一个自由的主号码,对0到255之间的所有主号码进行了验证。为什么改变了?

1 个答案:

答案 0 :(得分:3)

the list of assigned devicesthe commit itself中的信息提供了更多背景信息。

在进行此更改之前,分配动态char设备主程序确实确实循环到了0,如您所述。但是,低于234的结果无效;它只会在分配时导致警告,但是实际上,它是重复的char主键,如果两个设备(静态分配的设备和动态分配的设备)最终都被使用,则似乎会发生不相关的故障。 / p>

通过此更改,将强制实施动态分配的字符专业的有效范围,并扩展为允许使用20多个这样的设备。