gpt4 book ai didi

linux-kernel - find_dynamic_major 函数

转载 作者:行者123 更新时间:2023-12-04 04:54:16 25 4
gpt4 key购买 nike

内核版本 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 之间的所有主要数字。函数 major_to_index(i) 只返回 i % 255,因此第二个函数验证数组位置从 511 % 255,即 1 到 384 % 255,即 129。我的问题是,为什么 130 和233 未验证?在引入此功能之前,为了找到空闲的主编号,将验证 0 到 255 之间的所有主编号。为什么要更改?

最佳答案

the list of assigned devices中的信息和 the commit itself提供更多上下文。

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

随着这一变化,动态分配的 char major 的有效范围被强制执行,并扩展到允许超过 20 个这样的设备。

关于linux-kernel - find_dynamic_major 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52539356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com