《Linux内核修炼之道》第4章讲解系统初始化,万事开头难,系统的初始化是一个很复杂的过程,不过对于内核源码的学习来说,以这个部分开始应该是个不错的选择。特别是子系统初始化,应该是你选择任何内核子系统开始分析时都需要了解的内容。本节为大家介绍reset_init函数。
http://book.51cto.com/art/201007/213607.htm
- 438 static void noinline __init_refok rest_init(void)
- 439 __releases(kernel_lock)
- 440 {
- 441 int pid;
- 442
- /* reset_init()函数最主要的历史使命就是
启动内核线程kernel_init */ - 443 kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
- 444 numa_default_policy();
- /* 启动内核线程kthreadd,运行kthread_
create_list全局链表中的kthread */ - 445 pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
- 446 kthreadd_task = find_task_by_pid(pid);
- 447 unlock_kernel();
- 448
- 449 /*
- 450 * The boot idle thread must execute schedule()
- 451 * at least once to get things moving:
- 452 */
- /*
- * 增加idle进程的need_resched标志, 并且调用schedule释放CPU,
- * 将其赋给更应该获取CPU的进程。
- */
- 453 init_idle_bootup_task(current);
- 454 preempt_enable_no_resched();
- 455 schedule();
- 456 preempt_disable();
- 457
- 458 /* Call into cpu_idle with preempt disabled */
- /*
- * 进入idle循环以消耗空闲的CPU时间片, 该函数
从不返回。然而,当有实际工作 - * 要处理时,该函数就会被抢占。
- */
- 459 cpu_idle();
- 460 }