Linux kernel 查找\u动态\u主要功能

Linux kernel 查找\u动态\u主要功能,linux-kernel,Linux Kernel,内核版本v4.14 rc1引入了函数find\u dynamic\u 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

内核版本v4.14 rc1引入了函数
find\u dynamic\u 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;
}
具有以下值:

  • 数组大小(chrdevs)=255

  • CHRDEV\u MAJOR\u DYN\u END=234

  • CHRDEV\u MAJOR\u DYN\u EXT\u START=511

  • CHRDEV\u MAJOR\u DYN\u EXT\u END=384

在第一部分中,该函数遍历254和234之间的所有主要数字。已验证的阵列位置介于254到234之间。在第二部分中,该函数遍历511和384之间的所有主要数字。函数
major\u to\u index(i)
只返回i%255,因此第二个函数验证从511%255(即1)到384%255(即129)的数组位置。我的问题是,为什么130和233之间的位置没有得到验证?在引入此函数之前,为了找到一个自由的主数字,所有0到255之间的主数字都经过了验证。更改原因?

中的信息并提供更多上下文

在此更改之前,分配一个动态char设备主项确实循环到了0,正如您所提到的。然而,234以下的结果是无效的;它只会在分配时发出警告,但实际上它是一个重复的char-major,如果两个设备(静态分配的设备和动态分配的设备)最终都被使用,则会发生看似无关的故障


通过此更改,可以强制执行动态分配的char-majors的有效范围,并扩展到允许20多个此类设备。

谢谢!!现在它有意义了