Boot

誰載入了身份映射頁表?

  • January 29, 2019

想了解Linux x86_64的啟動步驟,看了一些文章和linux-3.14.65/Documentation/x86/boot.txt,差不多知道執行的第一條指令vmlinuxstartup_x86,但是看了arch/x86/kernel/head_64.Sabout中的評論startup_64

   .text
__HEAD
.code64
.globl startup_64
startup_64:
/*
* At this point the CPU runs in 64bit mode CS.L = 1 CS.D = 0,
* and someone has loaded an identity mapped page table
* for us.  These identity mapped page tables map all of the
* kernel pages and possibly all of memory.

我仍然對評論感到困惑,我不知道是誰製作的CPU runs in 64bit mode,誰製作的has loaded an identity mapped page table for us?是Grub嗎?我想念什麼?

startup_64可以輸入

/* The entry point for the PE/COFF executable is efi_pe_entry. */
ENTRY(efi_pe_entry)
...
   movl    BP_code32_start(%esi), %eax
   leaq    startup_64(%rax), %rax
   jmp *%rax
ENDPROC(efi_pe_entry)

或者,我相信程序handover_entry內部efi_pe_entry可能會直接由支持 Linux 的 EFI 引導載入程序跳轉到。這種混合方法允許引導載入程序繼續提供某些特定於 linux 的功能,同時允許核心使用特定於 EFI 的功能。請參閱EFI 系統上的引導過程 (LWN.net)

最後,startup_64可能會跳轉到 from startup_32;當核心由支持 Linux 的 BIOS 引導載入程序載入時,就會發生這種情況。

(好吧,還有一種情況。64 位核心可能有一個efi32_stub_entry點然後跳轉到startup_32. 我忽略了這一點。32 位 EFI 上的 64 位核心仍然標記為實驗性的)。

基於以上所述,我不確定這startup_64是否是執行的第一條指令vmlinux。評論說它可以“直接從 64 位引導載入程序”輸入,但我不知道有這樣的事情。

在 BIOS 案例中,您可以清楚地看到它startup_32負責設置初始 64 位頁表(“早期 4G 啟動頁表”),當然還有切換到 64 位模式,即“長模式”。

在 EFI64 的情況下,CPU 已經處於 64 位模式。 efi_pe_entry呼叫make_boot_params()efi_main()eboot.c. (handover_entry只是呼叫efi_main(),在這種情況下引導載入程序提供struct boot_params)。 eboot.c不設置頁表。因此,評論假設 EFI 至少為其載入的核心的所有頁面(包括任何bss空間)設置了標識映射,這對我來說很有意義:-)。

https://elixir.bootlin.com/linux/v4.20/source/arch/x86/boot/compressed/head_64.S

引用自:https://unix.stackexchange.com/questions/275334