Задачи инициализации и подкачки в Linux

Я запутался в задачах инициализации и подкачки в ядре Linux. Насколько я понимаю, задача подкачки похожа на задачу бездействия — она запускается, когда другие процессы не могут быть запущены. Задача инициализации остается в спящем режиме и просыпается, чтобы пожинать процессы, когда это необходимо.

Я добавил еще один элемент в блок управления задачами, который я хочу инициализировать нулем для ВСЕХ задач (включая инициализацию и подкачку)

В linux/init_task.h есть макрос с очень запутанным названием INIT_TASK, который, по-видимому, устанавливает начальные значения для блока управления задачами задачи подкачки.

Где установить начальные значения для блока управления задачами init? Я могу установить начальные значения для всех других задач в функции copy_process в файле kernel/fork.c, когда они разветвляются.


person Sahil Sapre    schedule 04.10.2011    source источник


Ответы (1)


Макрос INIT_TASK используется для инициализации структуры бездействующей задачи (p->comm="swapper", так называемый swapper), которая будет связана с vmlinuz.

задача 'init' с pid = 1 в системе разветвляется в 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 как обычно.

person gnomecn    schedule 06.09.2012