Linux 中的 Init 和 swapper 任务

发布于 2024-12-08 03:14:22 字数 331 浏览 3 评论 0原文

我对 Linux 内核中的 init 和 swapper 任务感到困惑。我的理解是,交换器任务就像一个空闲任务 - 它在没有其他进程可运行时运行。 init 任务保持休眠状态,并在需要时唤醒以收割进程。

我在任务控制块中添加了另一个元素,我想将所有任务(包括 init 和 swapper)初始化为零。

在 linux/init_task.h 中有一个命名非常令人困惑的宏 INIT_TASK,它似乎设置了交换器任务的任务控制块的初始值。

在哪里设置 init 的任务控制块的初始值?当它们分叉时,我可以在 kernel/fork.c 中的 copy_process 函数中为所有其他任务设置初始值。

I'm confused about init and swapper tasks in the Linux kernel. My understanding is that the swapper task is like an idle task - it runs when no other processes are runnable. The init task stays asleep, and wakes up to reap processes when required.

I've added another element to the task control block, which I want to initialize to zero for ALL tasks (including init and swapper)

There is a very confusingly named macro, INIT_TASK, in linux/init_task.h, which, seemingly sets the initial values for the task control block of the swapper task.

Where do I set the initial values for the task control block of init? I'm able to set the initial values for all other tasks in the copy_process function in kernel/fork.c when they fork.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

贱贱哒 2024-12-15 03:14:22

INIT_TASK 宏用于初始化空闲任务(p->comm="swapper",所谓的swapper)结构,该结构将链接到vmlinuz。

系统中 pid = 1 的“init”任务在 start_kernel() 末尾的 rest_init() 中分叉。

/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的任务控制块的初始值。

INIT_TASK macro is used to initialise the idle task (p->comm="swapper", so called swapper) structure which will linked into vmlinuz.

the 'init' task with pid = 1 in the system, is forked in the rest_init() in end of the 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);

so you can set the initial values for the task control block of init as normal.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文