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盘的操作,可 ...
随机推荐
- Kafka集群部署 (守护进程启动)
1.Kafka集群部署 1.1集群部署的基本流程 下载安装包.解压安装包.修改配置文件.分发安装包.启动集群 1.2集群部署的基础环境准备 安装前的准备工作(zk集群已经部署完毕) 关闭防火墙 c ...
- 云备份厂商Rubrik再获2.61亿美元融资,估值高达33亿美元 转自中国存储网
数据管理初创公司Rubrik在Bain Capital Ventures领导的最新一轮融资中筹集了2.61亿美元,估值为33亿美元. 现有的利益相关者 - Lightspeed Venture Par ...
- JS事件常用事件
oncontextmenu对象右击 举例1: <form id="form1" name="form1" method="post" ...
- PAT 1114 Family Property[并查集][难]
1114 Family Property(25 分) This time, you are supposed to help us collect the data for family-owned ...
- 2.6 The Object Model -- Bindings
一个binding在两个属性之间创建一个链接,当一个改变时,另外一个被自动更新为一个新的值. bindings可以在同一个对象中连接两个属性,或者用在两个不同的对象中. 不像大多数框架一样包含某种形式 ...
- Linux系统——搭建FTP方式的本地定制化Yum仓库
(1)搭建公网源yum仓库 安装wget aliyun源 # wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epe ...
- 2.JVM运行机制 -- JVM序列
上一次写了1.初步认识JVM -- JVM序列,今天接着记录写JVM的运行机制. 一.JVM启动流程 Java平台包括JVM以及Java语言,其中JVM也是运行在操作系统中的一个应用程序进程,那么也应 ...
- EF code first:列名 'Discriminator' 无效
使用EF code first编写类继承的时候,出现列名 'Discriminator' 无效 . 字段中没有列名 'Discriminator' 原来在代码中,定义了一个类A,类B,B继承A,但是数 ...
- Bootstrap fileinput v3.0(ssm版)
说明在上一个版本即Bootstrap fileinput v2.0(ssm版)的基础上,增加了多处都需要上传的需求 核心代码ArticleController.java package com.isd ...
- xgboost 自定义评价函数(metric)与目标函数
比赛得分公式如下: 其中,P为Precision , R为 Recall. GBDT训练基于验证集评价,此时会调用评价函数,XGBoost的best_iteration和best_score均是基于评 ...