initcall_levels数组结构
时间: 2023-12-08 07:04:04 浏览: 27
initcall_levels是一个整型数组,用于存储Linux内核初始化过程中各个初始化函数的优先级。它是由枚举类型initcall_level定义的,该枚举类型定义了7个不同的初始化级别,分别是:
1. EARLY_BOOT:早期引导阶段
2. ARCH_EARLY_INIT:架构早期初始化
3. SUBSYS_EARLY_INIT:子系统早期初始化
4. FS_EARLY_INIT:文件系统早期初始化
5. DEVICE_EARLY_INIT:设备早期初始化
6. CPU_ONLINE:CPU在线初始化
7. NORMAL:普通初始化
在initcall_levels数组中,数组下标表示初始化级别,数组值表示该级别下的初始化函数个数。
例如,initcall_levels[ARCH_EARLY_INIT] = 2,表示架构早期初始化级别下有2个初始化函数。
相关问题
bool initcall_debug; core_param(initcall_debug, initcall_debug, bool, 0644);
这是 Linux 内核中的一段代码,它定义了一个名为 initcall_debug 的 bool 类型的变量,并使用 core_param 宏将其暴露为内核参数,其权限为 0644。
这段代码的作用是在内核编译时启用 initcall_debug 功能,从而在内核启动时输出初始化函数的调试信息。对于开发人员来说,这样可以更方便地进行内核调试和分析。
需要注意的是,这段代码只是内核中的一部分,如果要启用 initcall_debug 功能,还需要在内核启动参数中添加 "initcall_debug"。
initcall_from_entry函数详解
initcall_from_entry函数是Linux内核初始化过程中的一部分,其作用是将定义为__initcall的函数指针添加到初始化调用链表中。这个函数被定义在init/main.c中。
具体来说,当内核启动时,会执行一系列的初始化函数,例如设备驱动初始化、内存管理初始化等。这些初始化函数被定义为__initcall,表示它们只在内核启动时被调用一次,并且在初始化完成后会被释放掉。这些函数指针被存储在一个初始化调用链表中。initcall_from_entry函数就是将这些函数指针添加到初始化调用链表中的。
initcall_from_entry函数的参数是一个函数指针,指向一个定义为__initcall的初始化函数。函数的实现比较简单,它会将传入的函数指针添加到初始化调用链表中。具体的实现过程可以参考以下代码:
```c
static void __init initcall_from_entry(initcall_entry_t *entry)
{
initcall_t fn = (initcall_t) entry->function;
int level = initcall_level(entry);
if (level != -1) {
list_add_tail(&entry->list, &initcall_levels[level]);
printk(KERN_DEBUG "Registered initcall %s with priority %d\n",
entry->name, level);
}
}
```
在函数中,首先将传入的函数指针转换成initcall_t类型,并通过initcall_level函数获取该函数的优先级level。如果level不等于-1,表示该函数是一个有效的初始化函数,将其添加到对应优先级的初始化调用链表中。最后打印一条日志信息,表示该函数已经被注册。
总的来说,initcall_from_entry函数是Linux内核初始化过程中的一部分,负责将定义为__initcall的初始化函数添加到初始化调用链表中。