内核版本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之间的所有主号码进行了验证。为什么改变了?
答案 0 :(得分:3)
the list of assigned devices和the commit itself中的信息提供了更多背景信息。
在进行此更改之前,分配动态char设备主程序确实确实循环到了0,如您所述。但是,低于234的结果无效;它只会在分配时导致警告,但是实际上,它是重复的char主键,如果两个设备(静态分配的设备和动态分配的设备)最终都被使用,则似乎会发生不相关的故障。 / p>
通过此更改,将强制实施动态分配的字符专业的有效范围,并扩展为允许使用20多个这样的设备。