uefi和legacy bios的深度剖析

2023-05-16

这个是我总结的,参考了几个论坛还有《鸟哥的私房菜》,还有一部分是我自己的经验..适合初步了解uefi和legacy的人更深入的了解

uefi&legacy

Legacy

1.我们可将MBR磁盘分区结构用下图简单表示(Windows下基本磁盘、4个主分区):
这里写图片描述

为了方便计算机访问硬盘,把硬盘上的空间划分成许许多多的区块(英文叫sectors,即扇区),然后给每个区块分配一个地址,称为逻辑块地址(即LBA)。

  • 在MBR磁盘的第一个扇区内保存着启动代码(446bytes)和硬盘分区表(64bytes)。
  • 启动代码(446bytes) 的作用是指引计算机从活动分区引导启动操作系统(BIOS下启动操作系统的方式);
  • 分区表的作用是记录硬盘的分区信息。在MBR中,分区表的大小(64bytes)是固定的,一共可容纳4个主分区信息,每一个都记录区段的开始与结束柱面号码。扩展分区(操作系统限制)最多有一个,扩展分区的目的是使用额外的扇区来记录分区信息 。
  • 在MBR分区表中逻辑块地址采用32位二进制数表示,因此一共可表示2^32(2的32次方)个逻辑块地址。如果一个扇区大小为512字节,那么硬盘最大分区容量仅为2TB.

2.原理
       磁盘起始位置以特定格式描述磁盘上的分区,并包含“启动装载程序 (boot loader)”,BIOS 固件知道如何执行这一小段启动装载程序代码。启动装载程序的职责是启动操作系统(现代启动装载程序的大小通常超出了 MBR 空间所能容纳的范围,因此必须采用多阶段设计,其中 MBR 部分只知道如何从其他位置加载下一阶段)。

3.引导顺序
       bios->mbr(内含引导加载程序)->引导加载程序boot loader(一个可读取内核文件来执行的软件)(作用1提供菜单2载入内核3其它的loader)。
安装系统的时候mbr和boot sector(每一个分区的第一个扇区,文件系统会保留)均放bootloader(所以先装linux后装win,引导会掉)。但是windows的bootloader没有转移控制权的功能。所以一般mbr放grub引导装载程序(1指向linux内核文件2移交控制权给boot sector的windows bootloader)。

       系统启动时顺序 BIOS -> MBR (主引导记录)-> DPT (硬盘分区表)-> PBR -> 寻找根目录下 NTLDR(XP) ->boot.ini(xp)
BIOS -> MBR -> DPT -> PBR-> 寻找根目录下bootmgr(WIN7/Vista)/grldr(Grub)/btldr.mbr(BootLink)->\boot\bcd->winload.exe->内核
       当xp和win7共存,则bootmgr起作用。Xp显示为早期的windows版本

4.要求

  • bios方式只要存在一个非隐藏的活动主分区(必须放在这,如果不放在活动分区,可以用ntbootautofix修复,会自动从非活动分区的系统盘复制引导进入活动分区!)就能引导系统。所以可以将系统装在任何一个分区。也可以将系统和引导放不同分区。这个主分区的位置不固定。然后安装系统成功后系统自动设置这个活动主分区为隐藏。

GPT磁盘分区结构可用下图简单表示(Windows下基本磁盘):
GPT分区结构
这里写图片描述

  • 在GTP磁盘的第一个数据块中同样有一个与MBR(主引导记录)类似的标记,叫做PMBR。PMBR的作用是,当使用不支持GPT的分区工具时,整个硬盘将显示为一个受保护的分区,以防止分区表及硬盘数据遭到破坏。UEFI并不从PMBR中获取GPT磁盘的分区信息,它有自己的分区表,即GPT分区表。
  • GPT的分区方案之所以比MBR更先进,是因为在GPT分区表头中可自定义分区数量的最大值,也就是说GPT分区表的大小不是固定的。在Windows中,微软设定GPT磁盘最大分区数量为128个。另外,GPT分区方案中逻辑块地址(LBA)采用64位二进制数表示,可以计算一下2^64是一个多么庞大的数据,以我们的需求来讲完全有理由认为这个大小约等于无限。除此之外,GPT分区方案在硬盘的末端还有一个备份分区表,保证了分区信息不容易丢失。
    这里写图片描述

Windows操作系统对GPT磁盘的支持
       因为BIOS无法识别GPT分区,所以BIOS下GPT磁盘不能用于启动操作系统,在操作系统提供支持的情况下可用于数据存储。
       UEFI可同时识别MBR分区和GPT分区,因此UEFI下,MBR磁盘和GPT磁盘都可用于启动操作系统和数据存储。
下表列出了Windows各版本操作系统对GPT磁盘的支持程度:
32位Windows对GPT分区支持情况
这里写图片描述

64位Windows对GPT分区支持情况
这里写图片描述
2.原理
在ESP分区(或者fat32,即使是这样,在win系统下该分区还不可见)下,(“√”表示必不可少的文件,其他可以删除,但是必须是下面的路径!!!,不区分大小写):
EFI/Boot/bootx64.efi(或bootia32.efi)
√ EFI/Microsoft/Boot/bootmgfw.efi
√ EFI/Microsoft/Boot/BCD
EFI/Microsoft/Boot/zh-CN
boot×64是系统引导,凌驾于win引导之上,可以读取开机项

2.启动顺序:
①一般情况下(系统引导和windows引导都管用)
\efi\boot\bootx64.efi->\efi\microsoft\boot\bootmgfw.efi->\efi\microsoft\boot\bcd->winload.efi
②系统引导(windows boot manager不管用了,系统引导管用)
\efi\boot\bootx64.efi->\efi\microsoft\boot\bcd->winload.efi
③windows引导(windows boot manager) \efi\microsoft\boot\bootmgfw.efi->\efi\microsoft\boot\bcd->winload.efi

3.修复引导
bcdboot.exe 会修复系统引导,而且会同时修复计算机默认引导和Windows 默认引导,即在esp(fat)分区下没有任何文件下的情况下完成所有的文件复制。在ESP分区同时出现bootx64.efi和bootmgfw.efi,并且bootx64.efi是由bootmgfw.efi 改名而来的。与此同时在Boot Menu启动选择菜单那里生成“Windows Boot Manager”,Windows Boot Manager 及其包含的信息是保存在主板上的NVRAM里面的,而不是保存在硬盘上,故删除Windows Boot Manager需要到BIOS设置区删除。

4.UEFI及其优势

  • 仅从系统启动原理方面来做比较。UEFI之所以比BIOS强大,是因为UEFI本身已经相当于一个微型操作系统,其带来的便利之处在于:首先,UEFI已具备文件系统(操作系统组织管理文件的一种方法,直白点说就是把硬盘上的数据以文件的形式呈现给用户。Fat32、NTFS都是 常见的文件系统类型)的支持,它能够直接读取FAT分区中的文件;
  • 其次,可开发出直接在UEFI下运行的应用程序,这类程序文件通常以efi结尾。既然UEFI可以直接识别FAT分区中的文件,又有可直接在其中运行的应用程序。那么完全可以将Windows安装程序做成efi类型应用程序,然 后把它放到任意fat分区中直接运行即可,如此一来安装Windows操作系统这件过去看上去稍微有点复杂的事情突然就变非常简单了,就像在Windows下打开QQ一样简单。而事实上,也就是这么一回事。

要知道,这些都是BIOS做不到的。因为BIOS下启动操作系统之前,必须从硬盘上指定扇区读取系统启动代码(包含在主引导记录中),然后从活动分区中引导启动操作系统。对扇区的操作远比不上对分区中文件的操作更直观更简单,所以在BIOS下引导安装Windows操作系统,我们不得不使用一些工具对设备进行配置以达到启动要求。而在UEFI下,这些统统都不需要,不再需要主引导记录,不再需要活动分区,不需要任何工具,只要复制安装文件到一个FAT32(主)分区/U盘中,然后从这个分区/U盘启动,安装Windows就是这么简单。

6.要求

  • UEFI+GPT的ESP的位置也是可以随意设置的,在硬盘起始位置、中间位置、末尾,都可以,只要分区属性和其中的引导文件正确,就可以引导启动操作系统 。
  • gpt一定要uefi才能引导系统。uefi不一定要gpt只要有一个fat分区即可。
  • 不支持uefi的主板(系统支持uefi文件读取),使用大于2.2T的硬盘,可以用mbr(u盘,另一个硬盘)加gpt。前者放引导。此时系统可以装在gpt与mbr。
  • uefi加mbr下没有了活动分区,直接引导分区和系统分区。不能把引导放在esp分区,要放fat里面,并且这个分区一定要是活动分区!!!

7.经验
当uefi方式启动成功系统后引导丢了,目前出现了不能关机,但是能重启成功的现象。


grub2引导过程:
BIOS:
开机—>按照指定的顺序启动U盘—>启动U盘主引导—>主引导搜索指定位置的Grub.cfg—>加载Grub.cfg菜单,有用户自行选择启动项
UEFI
开机—>查找指定U盘内计算机默认引导文件:\efi\boot\bootx64.efi (grub2.efi改名)—>搜索指定位置的Grub.cfg—>加载Grub.cfg菜单,有用户自行选择启动项
大家如需自行定制Grub2的话需具备 ubuntu 系统,并且需要BIOS和UEFI版本的各一个,然后使用 grub-mkimage 定制。

linux中所谓挂载就是指进该目录可以直接读取该分区的意思。根目录一定要挂载到某一个分区。


Reset to Setup Mode恢复bios出厂设置,Restore Factory Keys用于清除或恢复内置的安全启动密钥,OS Optimized Defaults是一个“顶级”设置选项,开启该选项后,BIOS会自动将所有相关选项恢复为预装Win8/8.1 默认启动方式所要求的标准设置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uefi和legacy bios的深度剖析 的相关文章

  • 主板bios开启虚拟化支持

    Inter和AMD生产的主流CPU都支持虚拟化技术 但很多电脑或主板BIOS出厂时默认禁用虚拟化技术 某些比较老的CPU是不支持虚拟化技术 要确定其电脑CPU是否支持虚拟化技术 可以在 5分享 镜像 虚拟机下载检测工具 1 打开虚拟化检测工
  • EDK2安装教程

    1 1基础搭建 相关文件请自行百度下载 1 安装VS2015到C盘 请勿修改默认目录 否则需要修改C edk2 Conf tools def txt 2 如安装包所示 安装python2 7到C盘并设置环境变量如下 3 将nasm解压到C
  • 问题:your cpu does not support kvm extensions

    问题 我的BIOS开启了CPU虚拟化 但是虚拟机仍然显示your cpu does not support kvm extensions 解决 1 关闭虚拟机 2 虚拟机上单击右键 设置 3 选择下图选项 4 重启虚拟机 问题解决
  • 【Linux】【Ubuntu】在VMware虚拟机中安装Ubuntu18.04(UEFI启动图文教程)

    在VMware虚拟机中安装Ubuntu18 04 以UEFI方式启动 VMware 版本 15 5 以UEFI启动的Ubuntu系统安装方式与 Linux Ubuntu 在VMware虚拟机中安装Ubuntu18 04 保姆级图文教程 中记
  • 命名空间/解决方案结构

    我很抱歉问了这样一个笼统的问题 但这对我来说可能是一个挑战 我的团队即将开始一个大型项目 该项目有望将多年来不断发展的所有随机一次性代码库整合在一起 鉴于该项目将涵盖整个公司的标准化逻辑实体 客户 员工 小任务 控制小任务的大任务以及公用事
  • 如何管理 Perl 模块依赖关系?

    我目前正在进行一个项目 该项目使用另一个部门开发的框架作为基础进行开发 我们目前正在我们的部门引入质量标准 终于 耶 但目前不可能将这些标准引入其他部门 因此 我们面临着一个不断变化的目标 既没有 API 稳定性 也没有稳定的版本 这至少是
  • 从 UEFI 应用程序内部运行 UEFI shell 命令

    我是 UEFI 应用程序开发新手 我的要求是 我需要从 UEFI 应用程序运行 UEFI shell 命令 app efi 源代码 需要指导我如何做到这一点 Example cpUEFI shell 中的命令用于将文件从一个路径复制到 其他
  • Xcode 4.4.1 在 OSX Mavericks 下无法正常工作

    例子 iOS 3 1 3 的组织者显示 摘要丢失 键 它可能会因下一个崩溃数据而崩溃 未捕获异常 NSInternalInconsistencyException 未找到所需密钥 locatorclass 的扩展 Xcode Device
  • 引导加载程序如何读取 DVD(cd)?

    我有一个用汇编语言编写的第一阶段引导加载程序 我需要它从 DVD 或 CD 加载第二阶段引导加载程序 我只找到了从软盘或硬盘读取的示例 那里使用的中断是13h 在中断描述中它说它可以读取软盘和硬盘 我尝试使用 13h 来读取 CD 就好像它
  • 如何使用 HttpURLConnection 在 Java 中等待 Expect 100-Continue 响应

    I am stuck使用 HttpURLConnection 向 Web 服务器发出 PUT http 请求 我有一些代码可以很好地发出 PUT 请求 并且我可以在标头中简单地包含 期望 100 继续请求属性 但是尽我所能尝试 我似乎无法让
  • 我的 BIOS 设置中没有启用 Hyper-V 的选项

    我是 Windows Phone 8 应用程序开发新手 我安装了SDK 8 0 当我运行应用程序时 它显示一条错误 告诉我启用 Hyper V 在搜索过程中我发现这个 MSDN 文档BIOS 中有解决方案 但是当进入我的BIOS设置时 却没
  • asm更改cmd背景颜色

    我编写了更改文本颜色的部分 但我找不到更改背景颜色的方法 此代码用于 tasm 汇编 model small stack 256 data ent db 0ah 0dh array db 2 4 5 6 db 7 8 9 5 db 1 2
  • 包装 slf4j API

    我想将 slf4j 与 Logback 改造为遗留应用程序 好处是 遗留应用程序有自己的日志框架 所以我所要做的就是更改日志框架以记录到 slf4j 而不是 log4j 这就像做梦一样 我很高兴 直到我注意到 Logback 为每个日志事件
  • 为什么引导加载程序中的字节“0xea 0000 ffff”会导致计算机重新启动?

    我正在研究引导加载程序 发现了这个有趣的组件 Sends us to the end of the memory causing reboot db 0x0ea dw 0x0000 dw 0xffff 通过评论我知道它的作用 将计算机发送到
  • 找出 x86 引导加载程序中引导了哪个驱动器

    我正在为 x86 编写游戏引导加载程序 在启动早期的某一时刻 我需要将启动驱动器中的一些扇区加载到内存中 我使用中断 0x13 ah 02 来执行此操作 当我在虚拟机中尝试它时 它就像一个魅力 然而 当我将映像刻录到 USB 驱动器时 机器
  • 使用 int 13h 读取的扇区数量多于磁道上的扇区数量

    顺序是什么int 13h with ah 02h会读19部门起始于 C H S 0 0 1 提供了 2 个磁头 每磁道 18 个扇区 每面 80 个磁道的 软盘 磁盘几何结构 或者 更一般地说 当它到达磁道 0 的末尾 磁头 0 时会发生什
  • Docker:旧版 --link 参数的等价物是什么

    我需要将我的数据库容器与服务器容器连接 现在我只是对遗留参数感到愤怒 link 效果完美 gt docker run d P name rethinkdb1 rethinkdb gt docker run d link rethinkdb
  • 在大型 C++ 遗留应用程序中查找“死代码”[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我目前正在开发一个大型且古老的 C 应用程序 在我之前已有许多开发人员 项目中有很多 死代码 类和函数
  • 早期的BIOS怎么能使用CALL呢?

    我纯粹是出于爱好原因 试图理解 PC 中的一些低级代码 我为随机的旧千兆字节 MB 下载了一个过时的 BIOS ROM 映像 https www gigabyte com Motherboard GA 8I845GE775 G rev 10
  • 将 RequireJS 与遗留代码结合使用

    我正在处理一个非常大的项目 该项目使用 包含带有脚本标记的 javascript 文件的旧版 JSP 页面 使用其他 javascript 模块而不使用 RequireJS 的骨干模型和视图 现在 我们希望开始将 RequireJS 与 j

随机推荐

  • ThinkPad相机打开灰色加斜杠问题解决!!!

    问题是这样的 xff01 xff01 xff01 很久前是这样的 xff0c 一直弄不好 xff0c 删了驱动 xff0c 重装驱动 xff0c 注册表弄了 xff0c 反正是各种弄 xff0c 各种帖子找了还是不行 xff01 xff01
  • SSL error when connecting to the Jack server. Try ‘jack-diagnose‘

    Android7 编译出现jack admin启动问题 xff1a log如下 xff1a Launching Jack server java XX MaxJavaStackTraceDepth 61 1 Djava io tmpdir
  • 【IOS】史上最全文件操作NSFileManager

    功能列表 判断文件是否存在 43 BOOL fileExistsAtPath NSString aPath 判断文件是否存在Documents下 43 BOOL fileExistsAtDocumentsWithFileName NSStr
  • 【IOS】StoryBoard传值TableView点击Cell跳转传值(segue)

    问题 void prepareForSegue UIStoryboardSegue segue sender id sender 以上方法会先于 void tableView UITableView tableView didSelectR
  • Android Windows虚拟串口调试

    1 Configure Virtual Serial Port Driver 创建虚拟串口 2 设置Android模拟器虚拟串口 进入Android SDK的tools目录 xff0c 通过cmd执行命令 xff1a emulator ex
  • 贪心算法之木棍问题

    问题 H 木棒 时间限制 1 Sec 内存限制 32 MB 提交 147 解决 60 提交 状态 题目描述 现有n根木棒 xff0c 已知它们的长度和重量 要用一部木工机一根一根地加工这些木棒 该机器在加工过程中需要一定的准备时间 xff0
  • cephadm安装ceph v15

    cephadm 安装ceph v15准备 参考安装文档 有问题可以直接留言 xff0c 大家一起交流 xff0c 以下都是部署的比较基础的东西 https docs ceph com en latest cephadm http www d
  • Mysql启用SSL以及JDBC连接Mysql配置

    文章目录 一 Mysql启用SSL配置1 检查mysql是否支持ssl2 设置用户是否使用ssl连接1 查看用户是否使用SSL连接2 强制某用户使用SSL连接3 测试不使用ssl能否连接上4 取消用户使用ssl连接 二 JDBC连接Mysq
  • Proxmox ve 使用cloud-init模板生成虚拟机

    本文中斜体字部分为命令行 1 Cloud init 的作用 cloud init是一个Linux虚拟机的初始化工具 xff0c 被广泛应用在AWS和OpenStack等云平台中 xff0c 用于快速新建虚拟机 xff0c 并进行一些系统初始
  • YUV文件转opencv的Mat格式并且显示播放

    include lt stdio h gt include lt string h gt include lt opencv2 core core hpp gt include lt opencv2 imgproc imgproc hpp
  • python 元组的元素的元素可以被修改

    Python的元组与列表类似 xff0c 不同之处在于元组的元素不能修改 元组使用小括号 xff0c 列表使用方括号 元组创建很简单 xff0c 只需要在括号中添加元素 xff0c 并使用逗号隔开即可 假设元组的第3个元素是一个字典 xff
  • VOT Toolkit工具使用说明(Python版)

    VOT Toolkit工具使用说明 xff08 Python版 xff09 一 工具链接 vot toolkit python版 github链 xff1a https github com votchallenge toolkit vot
  • 构建ubuntu base 出现apt update错误

    apt get update 错误 Get 1 http ports ubuntu com ubuntu ports bionic InRelease 242 kB Err 1 http ports ubuntu com ubuntu po
  • pip 安装numba报错

    pip 安装numba报错 问题描述 xff1a 本人在一个十分干净的容器里面 xff0c 想pip安装numba库 xff0c 但是该库需要依赖llvmlite这个库 xff0c 然后就它自己安装llvmlite的时候 xff0c 就报错
  • VS code 进行python远程运行与调试以及简单可视化变量

    23 04 29更新 xff0c 增加环境变量的debug配置项 23 03 24更新 这个配置项实在太常用了 置顶了 我这自己也天天开这篇文章复制粘贴的 34 name 34 34 train debug 34 34 type 34 34
  • VScode debuger 的不算bug的bug,不运行了

    具体办法就是改python拓展的版本 xff0c 记得要关闭自动更新 xff0c 不然一会插件又不能用了 改进详情 xff0c 见这位大佬吧 xff0c 我就不细说了 利用vscode对python代码做Debug xff0c 无法调试的解
  • latex引用跳转失效

    这两天写论文 xff0c 写也就写了 xff0c 某一次查看的时候 xff0c 突然发现 xff0c 全文的引用跳转通通失效 就引用序号都对着呢 xff0c 不是显示的 xff1f 号那种完全找不到的情况 但是点击那个跳转引用的超链接 xf
  • WinEdt修改快捷键,自定义功能按键,增加快捷指令

    xff08 还得搞封面 xff0c 随便敲几个字吧 xff09 在前一段时间 xff0c 为了快速加粗Latex里面的文字 xff0c 就查了一下怎么搞快捷键 在菜单栏Insert gt Font gt Bold是有这个加粗按钮的 xff0
  • Ubuntu下能连上无线但不能上网

    Ubuntu下连上无线网以后 xff0c 无法上网问题 先确认是否可以访问网路 xff0c 使用一下命令 ping www baidu com 正常理论下 xff0c 上面一句应该是连不通 xff0c 会返回无法解析 然后我们再ping一下
  • uefi和legacy bios的深度剖析

    这个是我总结的 参考了几个论坛还有 鸟哥的私房菜 还有一部分是我自己的经验 适合初步了解uefi和legacy的人更深入的了解 uefi amp legacy Legacy 1 我们可将MBR磁盘分区结构用下图简单表示 xff08 Wind