現代操作系統如何啟動的魔法
HardenedVault 寫道 "在x86/amd64架構下,Linux內核通常被打包成bzImage格式,其中包含用于引導參數的部分填充數據結構,以及16位實模式,32位保護模式和64位長模式的多個階段入口點(如果為amd64構建),最后一個階段是自解壓縮平面二進制文件,它將正確解壓縮和執行gzip壓縮的內核映像, 也以平面二進制的格式,存儲在其數據段中。每個階段都將初始化下一階段的正確執行環境,將CPU切換到下一階段可以工作的模式,然后執行下一階段。當然,Linux內核能夠從16位實模式啟動,但它也允許引導加載程序為以后階段準備執行環境(例如32位保護模式或64位長模式),并從相應的入口點執行Linux內核。例如,如果引導加載程序本身主要在 32 位保護模式下工作,那么從其 32 位保護模式入口點引導 Linux 內核將是最有效的方法,而為 amd64 構建的 Linux 內核將在使用 kexec 引導另一個為 amd64 構建的 Linux 內核時選擇 64 位長模式的入口點。最近,QEMU 的一個bug導致 kexec 之后的內核崩潰,因為 kexec-ed 內核將無法解壓縮壓縮的 initrd。此錯誤僅影響在 QEMU 中使用壓縮內聯的新 Linux 內核。物理機器上的 kexec,以及在 QEMU 中使用壓縮的 initrd 引導 Linux 內核的其他方法,均不受影響。
當然,在 QEMU 中,使用未壓縮的initrd來創建新Linux內核是有效的,因此,如果您想在 QEMU中使用基于kexec的引導加載程序,則可能必須使用未壓縮的initrd才能引導目標系統。HardenedVault(賽博堡壘)的Vault Labs使用此類方法成功完成了vTPM環境下的遠程證明。"