start_kernel 是每个进程创建时候调用,还是linux kernel启动时候调用
时间: 2024-04-05 19:30:20 浏览: 12
`start_kernel` 是 Linux 内核的入口函数,它在 Linux 内核启动时被调用。当计算机启动时,BIOS 或 UEFI 固件会将控制权交给引导加载程序(Boot Loader),引导加载程序会从硬盘或网络中加载内核映像(Kernel Image)到内存中,并将控制权交给内核的入口函数 `start_kernel`。从这个意义上来说,可以认为 `start_kernel` 是 Linux 内核启动时被调用的。
`start_kernel` 函数的主要作用是初始化内核的各个子系统,如进程管理、内存管理、文件系统等等。具体来说,它会调用一系列的函数进行初始化,如 `setup_arch()`、`setup_per_cpu_areas()`、`setup_memory()`、`setup_sched()` 等等。一旦所有的子系统都被初始化完毕,`start_kernel` 函数就会调用 `rest_init()` 函数创建系统中的第一个进程,并进入内核主循环(Kernel Main Loop)。这个主循环会一直运行,直到系统关闭。在主循环中,内核会不断地处理各种事件,如进程调度、中断处理、系统调用等等。
相关问题
等待队列是再start_kernel 中初始化的吗
是的,等待队列是在 start_kernel() 函数中被初始化的。start_kernel() 函数是内核启动过程中的入口函数,它负责初始化内核的各种子系统和数据结构,然后启动系统初始化进程(即 systemd)。
在 start_kernel() 函数中,会调用 kernel_init() 函数来初始化内核的各种子系统和数据结构。kernel_init() 函数中会调用一系列的子函数来完成内核的初始化过程,其中就包括等待队列的初始化。
具体来说,等待队列是由宏定义 INIT_WAITQUEUE_HEAD(name) 在代码中定义和初始化的。当内核启动时,系统会创建一个名为 init的进程,这个进程会在 kernel_init() 函数中被创建。在这个进程被创建之前,等待队列已经被初始化了。
因此,等待队列是在 start_kernel() 函数中被初始化的。
start_kernel 怎么调到INIT_WAITQUEUE_HEAD
start_kernel() 函数并没有直接调用 INIT_WAITQUEUE_HEAD() 宏来初始化等待队列。实际上,等待队列的初始化是在宏定义 DECLARE_WAIT_QUEUE_HEAD(name) 中完成的。
DECLARE_WAIT_QUEUE_HEAD(name) 宏定义了一个等待队列头部的结构体变量,并使用 __WAIT_QUEUE_HEAD_INITIALIZER 宏对该结构体进行初始化。__WAIT_QUEUE_HEAD_INITIALIZER 宏是一个内部宏,用于初始化等待队列头部的双向链表。
在内核源代码中,INIT_WAITQUEUE_HEAD() 宏是由 DECLARE_WAIT_QUEUE_HEAD() 宏调用的。例如,在某个模块中定义了一个等待队列 my_waitqueue,可以使用以下代码来对这个队列进行初始化:
```c
DECLARE_WAIT_QUEUE_HEAD(my_waitqueue);
```
这个宏定义会生成以下代码:
```c
wait_queue_head_t my_waitqueue = __WAIT_QUEUE_HEAD_INITIALIZER(my_waitqueue);
```
这个代码会定义一个名为 my_waitqueue 的等待队列,并初始化它的头部节点。等待队列的头部节点是一个 wait_queue_head_t 结构体,它包含了一个双向链表,用于存储等待这个事件的任务。
因此,虽然 INIT_WAITQUEUE_HEAD() 宏也可以用于初始化等待队列,但在实际使用中,更常见的是使用 DECLARE_WAIT_QUEUE_HEAD() 宏来定义和初始化等待队列。