日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

linux内核 header.s,Linux启动代码header.S研究

發(fā)布時間:2025/4/16 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核 header.s,Linux启动代码header.S研究 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。