UEFI下windows启动过程
引导文件
在UEFI安装完操作系统后,Windows至少使用两个分区,一个叫做ESP分区(EFI SYSTEM PARTITION),用于存放启动文件,另一个则是BIOS下正常的系统分区,不同的是,BIOS下引导文件是winload.exe,UEFI下引导文件式winload.efi,两者都是pecoff格式的,但UEFI用的是各种固件接口,而BIOS使用的是中断。有时还会有一个MSR分区,不过这个分区并不重要,实验可以删除。
安装完成后,Windows还会将自己的启动管理器的信息写入固件的优先启动项中,这样在BDS阶段,固件会默认引导Windows启动管理器。默认情况下,UEFI固件加载的启动文件式EFI\BOOT\bootx64.efi(bootia32.efi),而Windows强制写入的启动项则会加载EFI\MICROSOFT\BOOT\bootmgfw.efi,这两个文件其实是一模一样的文件。
注册表项
系统安装完成后,安装程序会将引导信息保存在ESP中的BCD文件中,路径为EFI\microsoft\boot\BCD,BCD文件是一个注册表巢文件,反应到注册表里就是LOCAL_MACHINE下的BCD00000000,一般情况下hivelist是不导入这个文件的,我们可以在regedit中手工导入这个文件来查看。现在可以通过BOOTICE和REGEDIT一起看来理解这个文件。在Object下面是所有的启动ENTRY,每个ENTRY用一个GUID值标识。
每个ENTRY下有一个Description和Elements,其中Description就是这个ENTRY的描述信息,而Elements则是一系列键值对,其中键用一个数字表示,比如12000004就是引导名称,而1100001则是引导位置信息,这个键值对在BOOTICE中就表现位右边那一栏。
引导定位
现在分析这个1100001,选择完要启动的操作系统后,启动管理器就是从这个键值对来确定加载哪个分区的winload.efi。打开DiskGenius,点击系统分区,看它的分区GUID,可以看出0x20处的16字节是分区GUID,而0X38开始的16字节则是硬盘GUID。
在UEFI系统中,各种设备使用设备路径来标识,比如分区的路径可能就是pcicontroller()/pci(0,1)/sata(0,0,0)/hd(2,分区GUID,起始地址,结束地址)。
而对于Windows的loader来说,它只需要一个满足这样条件的设备路径就可以从那个设备启动:倒数第二个设备安装有EFI_BLOCK_IO_PROTOCOL,这样它就可以读取磁盘GUID来和0x38处的值进行比较,而倒数第一个设备是个分区设备(MSG_DP_TYPE),loader会通过这个设备的GUID和注册表中的进行比较来确定启动分区,这两个都匹配,那么Windows便会加载一个小型的NTFS文件系统,然后尝试着从那个分区设备中加载12000002也就是BOOTICE中ApplicationPath指定的引导文件。
启动过程
启动管理器(bootxxx.efi)会首先加载BCD文件,从BCD中读取所有启动项,如果有多个启动项并且没有默认启动项就会有一个菜单来显示,当用户选中其中某个启动项后,启动管理器就会从对应的分区(通过分区GUID)中读取winload.efi,如果这时找不到winload.efi,或者winload.efi签名校验失败,就会蓝屏0xc000000e,即找不到引导文件,加载完winload.efi后,控制权就正式交给winload.efi。
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进入内核。
UEFI下windows启动过程的更多相关文章
- UEFI BIOS模式下Windows系统启动过程以及引导文件修复方法
有关UEFI BIOS基础知识的简介,一年前在网易博客做过详细的概述.鉴于某些网友仍然对UEFI下Windows的启动过程不甚了解,虽然网上有各式各样的启动修复工具,但是对于新手来说,如果不明白其中的 ...
- Windows 启动过程
引言 启动过程是我们了解操作系统的第一个环节.了解 Windows 的启动过程,可以帮助我们解决一些启动的问题,也能帮助我们了解 Windows 的整体结构. 以下内容将分为[加载内核].[内核初始化 ...
- 个人从源码理解angular项目在JIT模式下的启动过程
通常一个angular项目会有一个个模块(Module)来管理各自的业务,并且必须有一个根模块(AppModule)作为应用的入口模块,整个应用都围绕AppModule展开.可以这么说,AppModu ...
- Windows启动过程(MBR引导过程分析)
catalogue . 电脑启动过程 . MBR分析(master boot record) - 位于整个硬盘的 扇区 . DBR(DOS boot record) - 位于柱面0,磁头1,扇区1,即 ...
- uefi下如何启动linux?
1. 有两种方式 1.1 直接从uefi shell启动linux内核 1.2 从uefi shell启动grub,然后再从grub启动linux内核 2. 需要哪些东西? 2.1 linux内核 2 ...
- Activity启动过程源代码分析
事实上写分析源代码文章总会显得非常复杂非常乏味,可是梳理自己看源代码时的一些总结也是一种提高. 这篇博客分析下Activity启动过程源代码,我会尽量说得简单点. 个人的观点是看源代码不能看得太细,否 ...
- 分布式事务_02_2PC框架raincat源码解析-启动过程
一.前言 上一节已经将raincat demo工程运行起来了,这一节来分析下raincat启动过程的源码 主要包括: 事务协调者启动过程 事务参与者启动过程 二.协调者启动过程 主要就是在启动类中通过 ...
- [oracle] oracle的三种密码验证机制以及在windows和linux下的不同启动过程
oracle数据库的密码验证机制: ① 操作系统验证 拥有SYSDBA和SYSOPER的用户用该方式验证此时数据库无需启动,也无需开启监听和实例服务. 要求:本地组ora_dba中有该操作系统的登录用 ...
- 在Linux下制作Linux&windows启动盘
在Linux下制作Linux&windows启动盘 如何在Linux-mint环境下,制作其他Linux发行版的UEFI启动盘,以及Windows10的UEFI模式启动盘. 对于U盘的操作,可 ...
随机推荐
- handle exceptions, opening and closing database connections
https://www.tutorialspoint.com/spring/spring_jdbc_framework.htm Spring - JDBC Framework Overview Whi ...
- CentOS 6.4下Squid代理服务器的安装与配置(转)
add by zhj: 其实我们主要还是关注它在服务器端使用时,充当反向代理和静态数据缓存.至于普通代理和透明代理,其实相当于客户端做的事,和服务端没有什么关系.另外,Squid的缓存主要是缓存在硬盘 ...
- python中的下划线(私有变量)
Python用下划线作为变量前缀和后缀指定特殊变量. - "单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量:不能用"from xx ...
- controller中两个方法之间共享一个变量LinkedHashMap
1:引用传递,创建一个变量,给两个线程都传递进去. 2:静态修饰 static 通过该修饰符说明,该变量只有一份, 所有线程共用一份. 例如下面的htmlidMap通过static变量修饰, up ...
- Windows Server 2008 R2(X64) MSDN镜像简体中文版与英文版ISO下载及Key激活码
Windows Server 2008 R2 MSDN ISO镜像简体中文版 文件名:cn_windows_server_2008_r2_standard_enterprise_datacenter_ ...
- 新版samba安装过程
yum install samba samba-client samba-swat cp -p /etc/samba/smb.conf /etc/samba/smb.conf.orig /bin ...
- 分布式ID方案有哪些以及各自的优势
1. 背景 在分布式系统中,经常需要对大量的数据.消息.http请求等进行唯一标识.例如:在分布式系统之间http请求需要唯一标识,调用链路分析的时候需要使用这个唯一标识.这个时候数据自增主键已 ...
- Python安装安装.whl包(安装pylint)
Python安装安装.whl包(安装pylint) Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码. 1,,下载.whl ...
- c++标准库vector&list使用练习
/* vector顺序存储,随机访问快 list链表存储,插入删除快 deque占用内存多,兼具两者优点 注意: 1.vector严格顺序存储 2.list的迭代器只能做++或--运算,要一次移动多个 ...
- iptable的使用
目录 iptables iptables iptables详解 2012-07-18 20:10:08 分类: LINUX 一:前言 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它 ...