我对Linux内核中的init和swapper任务感到困惑。我的理解是交换器任务就像一个空闲任务 - 它在没有其他进程可运行时运行。 init任务保持睡眠状态,并在需要时唤醒以获取进程。
我在任务控制块中添加了另一个元素,我想为所有任务(包括init和swapper)初始化为零
在linux / init_task.h中有一个非常容易混淆的命名宏INIT_TASK,它似乎设置了交换器任务的任务控制块的初始值。
在哪里设置init的任务控制块的初始值?我可以在fork / fork.c中的copy_process函数中设置所有其他任务的初始值。
答案 0 :(得分:2)
INIT_TASK
宏用于初始化空闲任务(p->comm="swapper"
,所谓的交换器)结构,它将链接到vmlinuz。</ p>
系统中pid = 1的'init'任务分叉在rest_init()
末尾的start_kernel()
。
/kernel-3.0.36/init/main.c
347static noinline void __init_refok rest_init(void)
348{
349 int pid;
350
351 rcu_scheduler_starting();
352 /*
353 * We need to spawn init first so that it obtains pid 1, however
354 * the init task will end up wanting to create kthreads, which, if
355 * we schedule it before we create kthreadd, will OOPS.
356 */
357 kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
因此您可以正常设置init的任务控制块的初始值。