linux 啓動 過程 學習 (x86_64)

1.   arch/x86/boot/header.S , kernel setup 從 _start開始。 設置 stack, bss, 最後跳轉到 arch/x86/boot/main.c。

2.  在main函數中,把kernel setup header 拷貝到 struct setup_header, 之後初console_init,  init_heap, validate_cpu, detect_memory(e820), keyboard_init, set_video, 最後go_to_protected_mode。

3. go_to_protected_mode 中打開A20, setup_idt, setup_gdt, 最終跳轉到 arch/x86/boot/compressed/head_64.S 中的startup_32函數。

4. startup_32中檢查是否需要重新加載segments, 之後計算編譯地址和實際加載地址的偏移, 然後設置內核棧,檢測是否支持long mode,再次計算偏移來確定解壓縮的地址。如果支持long mode的話,設置64 bit的GDT,進入PAE模式。再設置最初的4G頁表,最後打開分頁並進入long mode。跳轉到startup_64.

5. startup_64中,確定最終解壓縮地址,然後拷貝壓縮內核到該地址,清空BSS,跳轉到decompress_kernel地址處,開始解壓內核。

6. 3.12內核以後, 在解壓內核之前會確定是否要隨機話內核加載地址,如果是的話,計算一個可用的隨機地址,之後把內核解壓到該地址,然後跳轉到解壓後的內核處執行 arch/x86/kernel/head_64.S.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章