小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Linux啟動流程

 WUCANADA 2015-05-03

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();
parse_args("Booting kernel", static_command_line, __start___param,
  __stop___param - __start___param, &unknown_bootoption);

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ū)別,歸納為以下三點:

  • 內核線程執(zhí)行的是內核中的函數(shù),而普通進程只有通過系統(tǒng)調用才能執(zhí)行內核中的函數(shù)。
  • 內核線程只運行在內核態(tài),而普通進程既可以運行在用戶態(tài),也可以運行在內核態(tài)。
  • 因為內核線程指只運行在內核態(tài),因此,它只能使用大于PAGE_OFFSET(3G)的地址空間。另一方面,不管在用戶態(tài)還是內核態(tài),普通進程可以使用4GB的地址空間。

3.3 kernel_init()

此時與體系相關的部分已經(jīng)初始化完成,do_basic_setup()開始初始化設備,完成外設及驅動程序(直接編譯進內核的模塊)的加載和初始化。

3.4 init_post()

開啟init用戶進程,所謂Android的啟動流程從這里才剛剛開始。

Android部分的啟動流程參考http://blog.csdn.net/qianjin0703/article/details/8468312


    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多