Linux kernel 查找\u动态\u主要功能
内核版本v4.14 rc1引入了函数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
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
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多个此类设备。谢谢!!现在它有意义了