Legacy(历史的,遗留的,传统的)和UEFI指的是系统引导方式(Legacy为传统BIOS,UEFI为新式BIOS),MBR和GPT指的是磁盘分区表类型。
一般情况下都是Legacy+MBR, UEFI+GPT这两种组合。但Legacy+GPT,UEFI+MBR也可以实现。
Legacy用的是8086汇编,UEFI 99%以上用C,UEFI的APP和Drives可以用C/C++。
64位的UEFI固件是64位的操作系统(少数二合一平板用32位UEFI固件的可以忽略不计),Legacy是16位的。
Legacy是直接针对底层硬件细节,UEFI通过Firmware-OS Interface、Boot Services、Runtime Services为操作系统和引导器屏蔽了底层硬件的细节。
UEFI可以扩展,大多数硬件加载UEFI的驱动模块就可以完成初始化,驱动模块可以放在固件中,也可以放在设备上,比如显卡的GOP,系统启动就自动加载。UEFI中的每个Table和Protocol都有版本号,可以平滑升级。开发者可以自己根据规范开发UEFI应用程序和驱动程序。
UEFI基于time的异步操作,提高了CPU的效率,减少了等待时间。
UEFI舍弃了中断这种外部设备操作方式,仅保留了时钟中断,操作外部设备采用事件+异步操作,启动的时候按需加载外部设备。
UEFI有个安全启动功能,只有当程序的证书被信任才会被执行。
在UEFI模式下启动,启动的是EFI驱动和应用程序,而且只要系统一启动,就直接是64位的了。(少数二合一平板32位的UEFI固件忽略不计)
那么如果选择UEFI模式启动,所有的16位的MS-DOS实用程序,DOS工具包和其它的维护工具以及32位的应用程序都是无法加载和启动的。UEFI必须安装使用64位系统!
所以在UEFI模式下,我们不能引导32位的系统。
但是呢,在Legacy模式下呢,16位的DOS工具包、32位的程序和系统、64位的都可以OK。
本文只讨论原生UEFI和原生BIOS。
至于带有CSM兼容模块的UEFI本身就是UEFI+BIOS的结合体,自然全兼容没话说。
至于分区表,接下来慢慢说这个事。
硬盘一个逻辑扇区有512个字节,硬盘的第一个扇区,也就是0磁道0柱面1扇区,也就是逻辑扇区0,这个扇区就叫做主引导记录,叫MBR(master boot record)翻译成中文就叫(明(M)白(B)人(R)),就是你得弄明白了。
MBR记录了整块磁盘的重要信息,是计算机开机后访问磁盘时所必须要读取的首个扇区。主要有三个部分:
- 主引导分区(Master Boot Record,MBR):主要作用是检查分区表是否正确,并且在系统硬件完成自检以后将控制权交给磁盘上的引导程序(如GNU,GRUB)
- 分区表(partition table):占据64个字节,可以对四个分区的信息进行描述,其中每个分区的信息占据16个字节
- 结束标志字:0x55AA,最后两个字节,是检验主引导记录是否有效的标志
注:MBR有两个意思,根据语境确定指的是第一个扇区还是主引导分区。
下面这个图就是主引导记录:
引导程序后面4个字节 1B8-1BB 代表windows磁盘签名
1BE-1FD 64个字节是硬盘分区表DPT(Disk Partition Table)
最后的两个字节 1FE-1FF (即55 AA )是MBR的结束标志。
明白为什么MBR分区表最多为什么只能有4个主分区了吧?
因为每个分区信息需要16个字节,所以对于采用MBR型分区结构的磁盘,最多只能识别4个主(primary)或扩展(extend)分区。扩展分区也是主要分区的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区。
主分区和扩展分区
磁盘中最多可以有4个Primary和Extended的扇区,而Extended只能有一个,如果要把磁盘分区成四个分区,那么只能是:
-
P+P+P+P
-
或者
-
P+P+P+E
上面的情况中, 3P+E只有三个主分区可用,因为Extended不能被格式化作为数据访问的分区,还需要进一步分区成逻辑分区。如果要四个都可用,就需要分区成4P
扩展分区中逻辑驱动器的引导记录是链式的。每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR),其分区表的第一项指向该逻辑分区本身的引导扇区,第二项指向下一个逻辑驱动器的EBR,分区表第三、第四项没有用到
需要注意的问题:
- 主分区和扩展分区最多只有四个
- 扩展分区最多只能有一个
- 逻辑分区是由扩展分区持续切割出来的分区
- 只有主分区和逻辑分区才能被格式化作为数据访问的分区
- Linux系统默认将前4个序号作为主分区或扩展分区,而逻辑分区的序号肯定从5开始
下图来自Inside the Linux boot process,较为清晰的画出了MBR中各个部分的结构
GPT分区表位于磁盘的逻辑扇区第2-33号扇区,一共占用32个扇区,能够容纳128 (4*32)个分区表项。每个分区表项大小为128字节,所以Windows系统允许GPT磁盘创建128个主分区。
分区表项中记录着分区的起始,结束地址,分区类型的GUID,分区的名字,分区属性和分区GUID。
所以说除了MBR之外首尾还各需要33个扇区。手动分区的时候要特别注意尾部留空。
GPT分区的第1个扇区,也就是扇区0。
发现什么了?
GPT也有一个类似于MBR的东西,只不过引导记录是空的,windows磁盘签名有,而且分区表也有,只不过分区格式被定义为了EE,因为这个格式不存在,所以老旧的磁盘分区工具打开这个磁盘就会发现无法识别这个磁盘的格式,进而不会对磁盘进行分区操作。
看到这里,我们就已经明白了,所以说其实分区表也就是那么回事,GPT和MBR只不过是两种分配硬盘数据的方式而已。
GPT分区的0扇区可以写入主引导记录,也可以写入分区表,只不过需要手动换算一下。
所以传统Legacy BIOS启动GPT的分区是完全可行的。
而UEFI呢,本身就是读取硬盘的第一个FAT32分区的\efi\boot\bootx64.efi文件来引导系统的,那么无论分区格式是MBR还是GPT,都不会影响UEFI的正常引导。
这就是我们能够成功让传统BIOS启动GPT磁盘的操作系统;让UEFI启动MBR磁盘的操作系统的理论基础。
下面先说说UEFI启动MBR吧,首先MBR分区表一定要有一个FAT32分区,是不是活动分区无所谓,因为UEFI没有活动分区的说法。
只要手动修复一下FAT32分区的BCD文件就行了,用BOOTICE工具编辑一下就OK了。
如果遇到下图的错误,就是BCD的问题:
只要修复一下BCD就行了。下图就是UEFI的BIOS启动的MBR的磁盘
这个很简单,就不在啰嗦了
传统Legacy BIOS启动GPT,这个有点复杂,确实有点复杂……
其实也有几条技术路线可以选择的。
首先我们需求就是要传统Legacy
能启动gpt分区表的大硬盘。这个很繁琐,技术路线有几条,首先Legacy是可以读取主引导记录的440个字节,但是读了以后无法识别分区格式,所以说就要做一个镜像文件
里面包含需要使用的信息。目前我是直接做的扇区编辑,jmp到特定的扇区,用这个扇区的信息来引导到目标的,非常繁琐,这个技术太复杂没法推广。
所以我在研究另一种技术路线,就是模拟uefi的方式,这种方式常见于变色龙,三叶草,clover,duet。这个技术路线相对来讲就简单了。如果你有两块硬盘,一块mbr和另一块gpt,这个就很简单了,从mbr磁盘启动,加载模拟uefi,然后再引导gpt磁盘的系统。
可是如果是单一gpt的磁盘,那还是免不了做扇区编辑,前面留空一段空间,然后把镜像用16进制写进去,再加载到内存,然后运行模拟uefi的程序。这就有点复杂,比如说搞电路的,交流变直流 然后整流 降压 再滤波什么的,费很大劲就为了一个看起来很简单的结果。