linux内核 header.s,Linux启动代码header.S研究
Linux內(nèi)核從2.4升級到2.6之后,內(nèi)核的引導過程發(fā)生了許多變化,現(xiàn)在研究一下Linux內(nèi)核2.6版本的主要引導過程。
(參考資料:
1、《深入理解Linux內(nèi)核》附錄A;
2、Linux源碼自帶文檔http://lxr.linux.no/linux+v2.6.36/Documentation/x86/boot.txt、
3、Linux源碼header.S代碼http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/header.S
)
Linux內(nèi)核2.6版本系統(tǒng)引導步驟:
1、開機執(zhí)行BIOS代碼,主要就是POST過程和初始化硬件設備;
2、BIOS代碼運行結(jié)束后,BIOS把MBR(http://en.wikipedia.org/wiki/Master_boot_record)中的LILO第一部分代碼(http://en.wikipedia.org/wiki/LILO_(boot_loader))和分區(qū)表加載到內(nèi)存地址0X00007c00,最后跳轉(zhuǎn)到LILO第一部分代碼;
3、LILO第一部分代碼把自己加載到內(nèi)存地址0X00096a00,并在內(nèi)存地址0X00098000處設置實模式堆棧,然后LILO把自己的第二部分代碼加載到內(nèi)存地址0X00096c00,最后跳轉(zhuǎn)到LILO第二部分代碼;
4、LILO第二部分代碼把header.S(http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/header.S)代碼,一共兩個512字節(jié)(boot sector和setup)分別加載到內(nèi)存地址0X00090000和0X0009200,同時把Linux小內(nèi)核映像加載到內(nèi)存地址0X00010000或者Linux大內(nèi)核映像加載到內(nèi)存地址0X00100000,最后跳轉(zhuǎn)到header.S代碼的setup代碼(240行);
5、header.S代碼的setup過程調(diào)用main函數(shù)(http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/main.c)(301行),最后跳轉(zhuǎn)到main函數(shù)代碼;
6、main函數(shù)設置臨時的IDT表、GDT表、調(diào)用go_to_protected_mode()(http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/pm.c#L104)函數(shù)(177行)進入保護模式,最后跳轉(zhuǎn)到startup_32函數(shù)(http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/compressed/head_32.S);
7、startup_32函數(shù)調(diào)用decompress_kernel()(http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/compressed/misc.c)函數(shù)(151行)解壓Linux內(nèi)核映像到內(nèi)存地址0X00100000,最后跳轉(zhuǎn)到startup_32函數(shù)(http://lxr.linux.no/linux+v2.6.36/arch/x86/kernel/head_32.S);
8、startup_32函數(shù)為第一個進程0設置執(zhí)行環(huán)境,包括初始化段寄存器、初始化內(nèi)核頁表、設置內(nèi)核堆棧、加載GDT表、加載IDT表等,最后跳轉(zhuǎn)到start_kernel()函數(shù)(http://lxr.linux.no/linux+v2.6.36/init/main.c#L536);
9、start_kernel函數(shù)完整的初始化了所有Linux內(nèi)核,包括進程調(diào)度、內(nèi)存管理、系統(tǒng)時間等,最后調(diào)用kernel_thread()(http://lxr.linux.no/linux+v2.6.36/arch/x86/kernel/process.c#L273)函數(shù)(437行)創(chuàng)建init進程;
10、init進程加載開機登錄畫面。
PS:
Linux內(nèi)核2.4版本中內(nèi)核自帶引導程序bootsect.S文件,其作用相當于LILO,但是在2.6內(nèi)核中,引導程序統(tǒng)一由LILO或GRUB等來管理系統(tǒng)的引導,所以在2.6內(nèi)核中就沒必要自帶引導程序了,所以在2.6內(nèi)核中把bootsect.S文件和setup.S文件合成一個文件header.S文件,header.S文件被編譯成1K的代碼,用來保存Linux/x86 boot protocol數(shù)據(jù)(參考Linux源碼自帶文檔http://lxr.linux.no/linux+v2.6.36/Documentation/x86/boot.txt文件對Linux/x86 boot protocol的介紹),以及Linux內(nèi)核代碼的入口函數(shù)start_of_setup,這個入口函數(shù)由LILO指定跳轉(zhuǎn)到start_of_setup函數(shù)。
《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的linux内核 header.s,Linux启动代码header.S研究的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在linux系统中 用于配置和显示,在L
- 下一篇: linux设置账号权限设置,Linux账