493
Функция rest_init () кажется прямолинейной. Она просто создает поток, называемый init, убирает блокировку инициализации ядра и вызывает поток idle:
init/main.с
388 static void noinline rest_init(void)
389 {
CLONE_SIGHAND)
390 kernel_thread(init, NULL, CLONE_FS
3 91 unlock_kernel();
392 cpu_idle() ,-
393 }
Строка 388
Вы могли обратить внимание, что первая вызываемая start_kernel ( ) функция
не имеет приставки init. Из гл. 2 вы можете вспомнить, как мы говорили, что,
если функция имеет приставку init, это значит, что все используемые ей
переменные и память будут очищены/освобождены после завершения инициализации. Это выполняется с помощью функции f ree_initmem ( ), которую мы видели, когда рассматривали, что происходит в init(). Причина, по которой
rest_init ( ) не объявляется init, заключается в том, что она вызывает поток
init до его завершения (имеется в виду вызов cpu_idle). Так как поток init выполняет вызов free_initmem( ), возможно возникновение соревновательной ситуации, если free_initmem( ) вызывается перед завершением rest_init() (или корневым потоком).
Строка 390
Эта строка создает поток init, связанный также с процессом init, или процессом 1. Коротко говоря, все, что мы здесь сказали, распространяется на все структуры данных для вызывающих процессов. Поток ядра вызывает функцию init(), которую мы рассмотрим в следующем разделе.
Строка 391
Функция unlock_kernel ( ) ничего не делает на однопроцессорной системе. В противном случае она освобождает BKL.
Строка 392
Вызов cpu_idle ( ) превращает корневой поток в поток ожидания. Эта функция передает процессор планировщику и возвращается, когда у планировщика не остается необработанных процессов для запуска.
В этой точке мы закончили основную работу по инициализация ядра Linux. Теперь мы вкратце рассмотрим, что происходит в вызове init ( ).