2011年5月20日 星期五

Linux boot up seq. with pid0(idle) and pid1 (init)

          參考: 分析linux内核的idle的知识,可以了解到kernel idle特色,其中補充一些了解如下 :


PID0:


    這個就是最後idle task (cpu_idle),它是從start_kernel開始,在一連串的初始化及folk 出pid1 (kernel_init) 及pid2(kthreadd)後,就進入cpu_idle.


    cpu_idle 會引用pm_idle,這是函數指標,在initcall 的期間,設定相應的平台對應函數,例如:late_initcall(omap2_pm_init),過此,idle休眠與平台的關係就建立起來了。


   其中initcall 是在kernel_init thread 中,於 (pid0)fork  init前,do_basic_setup()裡引用do_initcalls()。


   initcall 裡會去執行driver 的module_init,其中platform_driver_reg的動作與start_kernel下setup_arch裡的platform_device_reg中,已註冊過的device 作名字的比對配對,然後作對上的driver module init的流程。


PID1:


  同上面提到PID1 從kernel_init 這個thread 開始,最終folk 出init 這個process。


 值得一提的是,init 最後常駐在記憶体中,它主要是將init.rc的內容,parsing 為action_list 及 service_list, 分類依序配置及執行,同時最後的loop 會去watch 那些不是oneshot 的service,一旦被kill掉時,利用SIGCHLD的通知,把它們再re-start出來。