日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

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

Linux內核從2.4升級到2.6之后,內核的引導過程發生了許多變化,現在研究一下Linux內核2.6版本的主要引導過程。

(參考資料:

1、《深入理解Linux內核》附錄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內核2.6版本系統引導步驟:

1、開機執行BIOS代碼,主要就是POST過程和初始化硬件設備;

2、BIOS代碼運行結束后,BIOS把MBR(http://en.wikipedia.org/wiki/Master_boot_record)中的LILO第一部分代碼(http://en.wikipedia.org/wiki/LILO_(boot_loader))和分區表加載到內存地址0X00007c00,最后跳轉到LILO第一部分代碼;

3、LILO第一部分代碼把自己加載到內存地址0X00096a00,并在內存地址0X00098000處設置實模式堆棧,然后LILO把自己的第二部分代碼加載到內存地址0X00096c00,最后跳轉到LILO第二部分代碼;

4、LILO第二部分代碼把header.S(http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/header.S)代碼,一共兩個512字節(boot sector和setup)分別加載到內存地址0X00090000和0X0009200,同時把Linux小內核映像加載到內存地址0X00010000或者Linux大內核映像加載到內存地址0X00100000,最后跳轉到header.S代碼的setup代碼(240行);

5、header.S代碼的setup過程調用main函數(http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/main.c)(301行),最后跳轉到main函數代碼;

6、main函數設置臨時的IDT表、GDT表、調用go_to_protected_mode()(http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/pm.c#L104)函數(177行)進入保護模式,最后跳轉到startup_32函數(http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/compressed/head_32.S);

7、startup_32函數調用decompress_kernel()(http://lxr.linux.no/linux+v2.6.36/arch/x86/boot/compressed/misc.c)函數(151行)解壓Linux內核映像到內存地址0X00100000,最后跳轉到startup_32函數(http://lxr.linux.no/linux+v2.6.36/arch/x86/kernel/head_32.S);

8、startup_32函數為第一個進程0設置執行環境,包括初始化段寄存器、初始化內核頁表、設置內核堆棧、加載GDT表、加載IDT表等,最后跳轉到start_kernel()函數(http://lxr.linux.no/linux+v2.6.36/init/main.c#L536);

9、start_kernel函數完整的初始化了所有Linux內核,包括進程調度、內存管理、系統時間等,最后調用kernel_thread()(http://lxr.linux.no/linux+v2.6.36/arch/x86/kernel/process.c#L273)函數(437行)創建init進程;

10、init進程加載開機登錄畫面。

PS:

Linux內核2.4版本中內核自帶引導程序bootsect.S文件,其作用相當于LILO,但是在2.6內核中,引導程序統一由LILO或GRUB等來管理系統的引導,所以在2.6內核中就沒必要自帶引導程序了,所以在2.6內核中把bootsect.S文件和setup.S文件合成一個文件header.S文件,header.S文件被編譯成1K的代碼,用來保存Linux/x86 boot protocol數據(參考Linux源碼自帶文檔http://lxr.linux.no/linux+v2.6.36/Documentation/x86/boot.txt文件對Linux/x86 boot protocol的介紹),以及Linux內核代碼的入口函數start_of_setup,這個入口函數由LILO指定跳轉到start_of_setup函數。

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的linux内核 header.s,Linux启动代码header.S研究的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。