linux内核启动流程x86,linux内核-x86_32位内核启动流程
arch/x86/boot/header.S
執行_start,第274行:
.global _start
_start:
然后跳轉執行start_of_setup,準備實模式建立堆棧,BSS段清0,為下步C語言執行建立環境。
start_of_setup:
然后跳轉到C代碼執行main:
# Jump to C code (should not return)
calll main
arch/x86/boot/main.c
執行main函數:
void main(void)
maim中使用BIOS中斷讀取一些硬件信息,如內存信息等。
main函數最后,再執行go_to_protected_mode函數。
arch/x86/boot/pm.c
執行go_to_protected_mode函數。
void go_to_protected_mode(void)
禁用中斷,開啟20位以上的地址線,設置保護模式,設置全局描述表。
函數最后執行protected_mode_jump
arch/x86/boot/pmjump.S
執行protected_mode_jump:
GLOBAL(protected_mode_jump)
該段開始的.code16指令,表示這段代碼依然是16位的實模式代碼。使能CR0寄存器中的PE(Protection Enable)位,進入32位保護模式。建立32位的堆棧,清除寄存器以允許將來擴展到32位引導協議。
跳轉到了code32_start地址處執行。
arch/x86/boot/compressed/head_32.S
執行startup_32:
__HEAD
ENTRY(startup_32)
執行過程,調用了efi_main
執行到,解壓內核
call decompress_kernel
arch/x86/boot/compressed/misc.c
執行decompress_kernel函數。
asmlinkage void decompress_kernel
會輸出打印Decompressing Linux…字樣。
解壓完成后跳轉到output。
/arch/x86/kernel/head_32.S
進入到第88行,開始執行
__HEAD
ENTRY(startup_32)
執行到第454行,跳轉到i386_start_kernel函數。
jmp *(initial_code)
/arch/x86/kernel/head32.c
執行i386_start_kernel函數。此函數最后調用start_kernel函數。
/init/main.c
執行start_kernel函數。開始啟動內核。
參考鏈接:
https://blog.csdn.net/jn1158359135/article/details/7436211
https://www.cnblogs.com/long123king/p/3545991.html
http://blog.chinaunix.net/uid-1701789-id-148056.html
總結
以上是生活随笔為你收集整理的linux内核启动流程x86,linux内核-x86_32位内核启动流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软 rms服务器端,微软RMS服务器部
- 下一篇: linux 其他常用命令