誰載入了身份映射頁表?
想了解Linux x86_64的啟動步驟,看了一些文章和
linux-3.14.65/Documentation/x86/boot.txt
,差不多知道執行的第一條指令vmlinux
是startup_x86
,但是看了arch/x86/kernel/head_64.S
about中的評論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
可能會跳轉到 fromstartup_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