这里为了区分:
BIOS一律指传统BIOS,
UEFI BIOS一律称呼为UEFI。
UEFI下的BIOS设置,一律称为UEFI设置。
写这篇的原因
一直就想写这个,因为自己折腾Hackintosh。
最初BootThink,后来Chameleon,现在Clover。
每次接触新玩意,都要纠结好久的“安装”问题:
我这个磁盘默认BootThink启动,我想重装Windows,会覆盖引导,怎么办。
BootThink要求启动分区是NTFS,这是什么鬼要求?想换个Kext还得重启回Windows?
这个Chameleon太老了,我想换新版本,直接替换ISO么?
听说了个叫XPCBoot的东西,那是什么玩意?教程怎么只给了一个装Duet的工具?Efildr20这个文件在哪下载?
这个什么iBoot,听说用这个的Hackintosh能打开BootCamp助理?但我怎么启动到了一个类似于BIOS设置的地方?
我这个老华硕装了Clover怎么启动不了?黑屏卡在那?屏幕只有一个6?
哇,这个老电脑平均一万次才能进Clover一次,怎么启动个Clover就要二十分钟?
新电脑支持了UEFI,终于能用Clover了!这个神马MBR、GPT是怎么回事?
教程里把Clover引导做在了U盘上,我怎么能摆脱优盘开机?
………………
直到我搞懂了Clover,直到我搞懂了UEFI,突然觉得:“哇!懂了原理之后,这些玩意一点都不难啊!”
嗯。上面是根因。
诱因是前几天有人问了我上面的加粗的那个问题。
其实这篇文章,也适合以下用户:
重装Windows,提示我什么MBR、GPT,不让装?
我想装个Linux,但我希望默认还是Windows。
我想重装Windows,可是我开机不再默认Grub,怎么回Linux?
“Windows无法定位现有分区,也无法。。。。。”
我电脑好几个磁盘,我把Windows装到了磁盘2上,怎么开机我在UEFI里选磁盘二开不开?
装Windows时候听说有个什么操作能装在VHD上?
那个什么EFI分区是干嘛的?
UEFI的启动U盘为啥非得FAT32?
不需要第三方工具就能做UEFI下的Windows安装盘?
以前我一直装Ghost版的Windows,UEFI之后真的没法Ghost了么?
我电脑是UEFI的,想装Linux,但我手头没优盘,听说也能搞定?
标题说是科普,可是我可能会习惯性的啰嗦技术细节。我尽量科普吧。
先说传统BIOS吧
一句话概括:BIOS只认识设备,不认识分区、不认识文件。
BIOS启动的时候,按照CMOS设置里的顺序,挨个存储设备看:(此处不讨论PXE和光盘)
这个存储设备的前512字节是不是以0x55 0xAA结尾?
不是,那就跳过。找下一个设备。
是的话,嗯,这个磁盘可以启动,加载这512字节里的代码,然后执行。
执行之后,后面的事,几乎就跟BIOS没啥关系了。
就是这样。
至于后面启动什么系统,取决于这512字节里存了谁家的代码。这个代码是各家的系统安装程序写进去的,目的是启动自家系统。
比如你装(或者重装)了Windows,这里面就变成了Windows的启动代码。
比如你装(或者重装)了Linux,这里面就会变成Grub的启动代码。
顺便这512字节包含了MBR分区表的信息。但是有人可能注意到,上面半句没提“系统装在哪个分区上了”,硬盘有几个分区。
其实BIOS并不认识分区表。哪怕磁盘上没有分区表,没分过区,只要前512字节有0x55 0xAA的结尾,有合适的引导代码,也是能启动的。
然后说UEFI
(此处只讨论民用64位架构下的UEFI。)
一句话概括,UEFI认识设备,还认识设备ROM,还认识分区表、认识文件系统以及文件。
UEFI启动的时候,经过一系列初始化(SEC、CAR、DXE什么的,SEC、CAR你们不需要懂。下一节里会说DXE阶段是干嘛的)
然后按照设置里的顺序,找启动项。启动项分两种,设备启动项和文件启动项:
·文件启动项,大约记录的是某个磁盘的某个分区的某个路径下的某个文件。对于文件启动项,固件会直接加载这个EFI文件,并执行。类似于DOS下你敲了个win.com就执行了Windows 3.2/95/98的启动。文件不存在则失败。
·设备启动项,大约记录的就是“某个U盘”、“某个硬盘”。(此处只讨论U盘、硬盘)对于设备启动项,UEFI标准规定了默认的路径“\EFI\Boot\bootX64.efi”。UEFI会加载磁盘上的这个文件。文件不存在则失败。
就是这样。
至于这个EFI文件会干嘛,主板是不管的。
但是随着Windows8.x,以及UEFI标准2.x,推出了一个叫做SecureBoot的功能。开了SecureBoot之后,主板会验证即将加载的efi文件的签名,如果开发者不是受信任的开发者,就会拒绝加载。
比如CloverX64.efi就好像没有签名。
UEFI的DXE与磁盘上的文件
一个磁盘分区,要格式化之后,才能往里存文件,格式化的时候,又能选择不同的文件系统。
比如Win10可以选FAT32、NTFS、exFAT、ReFS几种,Linux可以选ext2、ext3、ext4、FAT32等,macOS可以选FAT32、HFS+、APFS、exFAT几种。
其实每个操作系统,都会有文件系统驱动,然后才能读取某种文件系统。
比如Windows带了上述四种文件系统等驱动,Linux带了FAT32、ext等文件系统等驱动,macOS带了上述四种驱动以及NTFS等只读驱动。
设备也是一样的。
原版的WinXP只带了IDE驱动,没有SATA驱动;原版Win7只带了IDE和SATA驱动,没带NVMe驱动;Win8/Win10则带了IDE/SATA和NVMe三种驱动;macOS10.12带了SATA驱动以及苹果专用NVMe磁盘的驱动;macOS10.13带了SATA和标准NVMe驱动。
UEFI作为一个模糊了固件和操作系统界限的东西,作为一个设计之初就考虑到了扩展性的东西,它也是有驱动程序的。启动过程中的DXE阶段,全称叫Driver eXecution Environment,就是加载驱动用的。
首先各种PCI-E的设备,比如显卡,比如PCI-E的NVMe固态硬盘,都有固件。
其中支持UEFI的设备,比如10系列的Nvidia显卡,固件里就会有对应的UEFI的驱动。
题外话:浦科特的NVMe固态硬盘,UEFI版固件是没有那个丑丑丑的Logo的哦。那个丑丑丑丑的Logo是浦科特的BIOS版(Legacy版)固件。它被加载是因为主板默认为了兼容性,“StorageOptionROM”选项默认是Legacy的。改成UEFI,就见不到那个丑丑丑丑丑的浦科特Logo页了。
UEFI启动后,进入了DXE阶段,就开始加载设备驱动,然后UEFI就会有设备列表了。
对于其中的磁盘,UEFI会加载对应的驱动解析其中的分区表(GPT和MBR)。然后UEFI就会有所有分区的列表了。然后UEFI就会用内置的文件系统驱动,解析每个分区。然后UEFI就会认识分区里的文件了。比如“\EFI\Boot\bootX64.efi”。
作为UEFI标准里,钦定的文件系统,FAT32.efi是每个主板都会带的。所有UEFI的主板都认识FAT32分区。这就是UEFI的Windows安装盘为啥非得是FAT32的。
除此之外,苹果的主板还会支持hfs分区。如果某天Linus Torvalds推出了主板,我猜这主板一定会带EXT4.efi,哈哈哈哈哈。
如同Windows可以安装驱动一样,UEFI也能在后期加载驱动。
比如CloverX64.efi启动之后,会加载\EFI\Clover\drivers64UEFI下的所有驱动。包括VboxHFS.efi等各种efi。网上你也能搜到NTFS.efi。
再比如,UEFIShell下,你可以手动执行命令加载驱动。
题外话:一个没收钱的“广告”,我真的好喜欢Paragon这个公司啊。推出了NTFS for Mac、HFS for Windows、ExtFS for……等一套文件系统驱动啊,我买了好几份。后来看到这公司还推出了UEFI版的文件系统驱动合集,好想搞一套,但可惜这玩意只卖给主板厂商。
再插句嘴,Apple随着macOS10.13推出了APFS,很良心的放出了apfs.efi,广大Hackintosh用户的福音啊,把这玩意放进Clover里就能识别APFS分区里的HighSierra了!
说说EFI系统分区
UEFI规范里,在GPT分区表的基础上,规定了一个EFI系统分区(EFI System Partition,ESP),ESP要格式化成FAT32,EFI启动文件要放在“\EFI\<厂商>”文件夹下面。
比如Windows的UEFI启动文件,都在“\EFI\Microsoft”下面。
比如Clover的东西,全都放在“\EFI\Clover”下面。
但是Apple比较特殊,它的主板直接去HFS/APFS分区找启动文件。然而即便如此,Mac的ESP里还是会有一堆Apple的文件。