本帖最后由 2011whp 于 2021-1-29 20:42 编辑
windows启动过程(图是 自个画的,文字是网上的)
Winload.efi做的第一件事就是通过BootService的GetMemoryMap提供的物理内存信息来构造页表以及PFN数据库,然后将ntoskrnl,hal以及SYSTEM\Service下的所有Boot型驱动以及他们需要的导入库读取加载到内存中,因为此时还是保护模式下,所以需要页表中建立这些文件的映射信息。(在IA32e下的UEFI开机后是会默认开启分页的,但是虚拟内存和物理内存是1:1映射的,所以进了Windows内核后不可能还用原来的地址)读取完成后,会对这些文件进行签名校验,如果校验失败,那么会蓝屏INACCESSIBLE_BOOT_DEVICE,即启动设备无效。这一步完成后,Windows会进一步初始化GDT和IDT,然后在页表中分配内核堆栈,初始化SystemPTE。最后调用ExitBootService退出引导阶段,调用SetVirtualAddress将EFI部分固件内存映射到虚拟内存,然后把页表基址载入CR3寄存器,开启分页并跳转到ntoskrnl的KiSytemStartup进入内核。
|