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研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在linux系统中 用于配置和显示,在L
- 下一篇: linux设置账号权限设置,Linux账