linux核心 x86 32位核心啟動流程

2021-09-08 19:34:43 字數 1453 閱讀 5363

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...