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函式。開始啟動核心。
關於x86 32硬體
80386這種機器是intel32位cpu,上個世紀90年代普遍使用 只有16位定址空間,沒有保護機制 為了相容x86 16位機器 例如dos 80386加電啟動後處於實模式執行狀態,在這種狀態下軟體可訪問物理記憶體空間不能超過1mb,且無法發揮intel80386以上級別的32位cpu的4gb記憶...
關於x86 32硬體
80386這種機器是intel32位cpu,上個世紀90年代普遍使用 只有16位定址空間,沒有保護機制 為了相容x86 16位機器 例如dos 80386加電啟動後處於實模式執行狀態,在這種狀態下軟體可訪問物理記憶體空間不能超過1mb,且無法發揮intel80386以上級別的32位cpu的4gb記憶...
x86 32組合語言基礎彙總
從c 生成彙編 gcc o2 s code.c m32 fno omit frame pointer 編譯.s檔案為.o檔案 as o code.o code.s 32 使用gdb除錯則加 gstabs 鏈結.o檔案生成可執行檔案 ld o exe code1.o code2.o m elf i38...