在EFI(可扩展固件接口,也称为UEFI,即统一可扩展固件接口)方式启动Windows系统时,文件的调用关系相对复杂但有序。以下是EFI方式启动Windows系统时的文件调用关系详解:
一、启动阶段
固件加载
当计算机开机后,EFI固件首先被加载。固件负责初始化硬件并准备启动环境。
查找ESP分区
EFI固件会查找GPT(GUID分区表)硬盘上的FAT格式分区,即EFI系统分区(ESP)。这个分区通常包含引导Windows所需的文件。
加载启动管理器
固件会加载ESP分区中的启动管理器。在Windows中,这通常是EFI\BOOT\bootx64.efi(对于64位系统)或EFI\BOOT\bootia32.efi(对于32位系统)。然而,Windows安装过程中会将一个特定的启动管理器EFI\MICROSOFT\BOOT\bootmgfw.efi写入ESP,并设置为默认启动项。这个启动管理器与bootx64.efi(或bootia32.efi)实际上是相同的文件,但名称和路径不同。
二、启动管理器阶段
加载BCD文件
启动管理器加载后,会首先查找并加载ESP分区中的BCD(启动配置数据)文件。BCD文件是一个注册表格式的文件,包含所有可用的启动项及其配置信息。这个文件位于EFI\MICROSOFT\BOOT\BCD路径下。
显示启动菜单
如果BCD文件中包含多个启动项,并且没有设置默认启动项,启动管理器会显示一个启动菜单,让用户选择要启动的操作系统。
选择启动项
用户从启动菜单中选择一个启动项后,启动管理器会根据BCD文件中的信息,确定要加载的winload.efi文件的位置。
三、加载操作系统阶段
加载winload.efi
启动管理器加载用户选择的启动项对应的winload.efi文件。这个文件位于系统分区的\Windows\system32\目录下。在EFI环境下,这个文件是PECOFF格式的,并使用EFI固件接口。
初始化系统
winload.efi加载后,会开始初始化Windows系统。这包括加载内核(ntoskrnl.exe)、硬件抽象层(hal.dll)以及系统服务下的所有启动型驱动。
进入内核
初始化完成后,Windows系统会进一步初始化全局描述符表(GDT)和中断描述符表(IDT),分配内核堆栈,并调用ExitBootService函数退出引导阶段。然后,系统将EFI部分固件内存映射到虚拟内存,并把页表基址载入CR3寄存器,最终跳转到ntoskrnl的KiSystemStartup函数进入Windows内核。
综上所述,EFI方式启动Windows系统时的文件调用关系是一个复杂但有序的过程,涉及固件、ESP分区、启动管理器、BCD文件和winload.efi等多个文件和组件的协同工作。