|
1 Bootloader 對于一般的ARM處理器,CPU上電或復位執(zhí)行第一條指令所在地址,即第一段程序Bootloader的開始地址,Bootloader一般存于Nor-flash(XIP),支持芯片內執(zhí)行。 Bootloader的功能可總結為:1)初始化CPU時鐘,內存,串口等。2)設置Linux啟動參數(shù)。3)加載Linux內核鏡像。Android源碼位于根目錄下的/bootable文件夾。 系統(tǒng)正常啟動,運行Bootloader,初始化芯片,根據(jù)設置的啟動參數(shù)cmdline,加載Linux內核鏡像,將控制權交給內核。 系統(tǒng)在Bootloader模式下(非正常啟動模式),可使用fastboot, mmcboot等工具燒寫內核和文件系統(tǒng),順便提一下,Android手機分區(qū)一般分為內核區(qū)boot.img,系統(tǒng)區(qū)system.img,用戶數(shù)據(jù)區(qū)userdata.img,數(shù)據(jù)恢復區(qū)recovery.img等。 2 Linux內核鏡像 內核鏡像被加載到內存,首先進行自解壓,zImage, bzImage或uImage的頭部都內嵌有解壓縮程序,最終將內核解壓到內存的指定位置,開始運行內核。 3 啟動內核 源碼位于/kernel/init/main.c,線索可歸納為:啟動內核start_kernel() => 初始化Linux各大模塊 + rest_init() => 開啟內核線程kthreadd和kernel_init() => 初始化設備驅動程序do_basic_setup() + init_post() => 開啟第一個用戶進程init。 3.1 start_kernel() 源碼位于/kernel/init/main.c的start_kernel()函數(shù),完成初始化Linux系統(tǒng)的進程管理,內存管理,文件系統(tǒng)等工作,可以說個個都是重量級的工作。 這里有必要解釋下內核選項,因為Linux各個子系統(tǒng)的初始化都建立在內核選項的解析之后。 parse_early_param(); 1) 內核選項的注冊 通過__early_parm(str, fn)或__setup(str, fn)宏來注冊。兩者都調用__setup_param宏實現(xiàn),它將注冊的內核選項str所關聯(lián)的函數(shù)fn存放到.init.setup節(jié)。
2) 內核選項的解析 兩次注冊對應兩次解析,即parse_early_param()和parse_param(),解析時,會在__setup_start和__setup_end之間查找內核選項,當識別有內核選項時,即會調用相應的處理函數(shù)。內核解析完后,各個子系統(tǒng)的初始化就可通過kernel_init()=>do_basic_setup()=>do_initcalls()來完成。 3.2 reset_init() 開啟內核線程kthreadd和kernel_init,kthreadd用來運行kthread_create_list全局鏈表中的kthread,然后創(chuàng)建idle線程來占用掉cpu空閑的時間片。 內核線程又叫守護進程,關于內核線程和Linux普通進程的區(qū)別,歸納為以下三點:
3.3 kernel_init() 此時與體系相關的部分已經(jīng)初始化完成,do_basic_setup()開始初始化設備,完成外設及驅動程序(直接編譯進內核的模塊)的加載和初始化。 3.4 init_post() 開啟init用戶進程,所謂Android的啟動流程從這里才剛剛開始。 Android部分的啟動流程參考http://blog.csdn.net/qianjin0703/article/details/8468312
|
|
|