Mac 系统引导过程概述 & BootCamp 的秘密

前言

OS X 与Windows 在引导流程上有很大的差别,而且在Mac 上运行Windows 需要经过特殊的处理。造成这种差异的原因在于磁盘分区表格式。

 

分区表

一个磁盘抛开物理组成部分的话,它就是一个地址序列,这个序列从 0~n-1  ,每个地址包含 512B(字节)的空间。一般我们将这些地址称作逻辑块地址(LBA),每块由

512B   组成。分区表告诉操作系统,磁盘的分区有几个,从哪里开始到哪里结束。当将一个磁盘插入已经含有操作系统的机器上时,操作系统会检索这个磁盘的分区表,并正

确认识它的分区结构。一个磁盘是先有分区表,后有分区,然后才有文件系统,有了文  件系统才能被操作系统读写删。

 

分区表格式与系统引导的关系

磁盘分区表格式目前主要有两种,分别是MBR 分区表和GUID  分区表,两种分区表的主要区别在支持的分区数量上。前者仅支持4个主要分区,后者则可以扩展到

超过128个。

MBR,即Master Boot Record ,位置在磁盘的第一个逻辑扇区,即LBA0 的位置。一个逻辑扇区仅有 512B(字节) ,而且分给MBR 分区表的只有 64B ,每个分区占分区表的 16B ,剩下的字节由MBR 引导代码和其它组成。因为每个分区只有 16B 大小的分区表记录,所以寻址最大只能到 2.2TB 。下图的绿色部分

PBR,即Partition Boot Record ,位置在每个磁盘分区的开始部分,占用扇区不定。这个扇区一般保存着操作系统引导程序的所在位置。下图的红色部分。

文件系统,File System  ,操作系统对磁盘的所有操作都需要经过文件系统,删除文件指的是在文件系统里删除文件的索引条目,创建文件就是在在文件系统里添加索引条目并  将具体数据写入磁盘。常见的文件系统格式有: FAT exFAT NTFS HFS+ 。文件系统位置一般在PBR之后。下图黄色部分

 

传统的BIOS 引导操作系统过程如下图:

 

计算机器开机后,固化在ROM 里的BIOS 就会被加载到内存运行,BIOS 自检完毕以后加载COMS 的参数,通过COMS 的参数, BIOS 程序加载启动磁盘的MBR 到内存里运行。通过运行MBR 的代码,记录在MBR 分区表中,标记为活动分区的磁盘分区PBR 被加载到内存。与MBR 类似,PBR 在运行后加载操作系统的引导程序到内存运行,例如Windows 的bootmgr 。当引导程序运行后,操作系统内核就被加载运行,完成从

BIOS 程序中接手的引导流程。

传统的BIOS   比较低级,它不能像操作系统一样识别文件系统,所以磁盘必须要有一个固定的物理块作为引导块(Boot Block),这个引导块就是MBR 。

GPT,即Globally Unique Identifier Table ,全局唯一标识码分区表,简称GPT 或GUID

分区表(下面将混用这两个称呼)。由于MBR 分区表的局限性(还有BIOS

的),GPT 诞生了。GPT 由GPT 头和GPT 主体,GPT 备份组成。起始于磁盘LBA1的位置,相对的LBA0 仍然为MBR ,但是这个MBR 是被保护的,没有引导代码,仅仅有一个被标识为未知的分区,当支持GPT 分区表的操作系统检索到这个MBR 后就会

自动忽略并跳到LBA1 读取GPT  分区表。如下图,由于篇幅的关系,表的长度比例不等同与实际在磁盘地址里的实际比例。

 

EFI,是一种取代传统BIOS 的一种技术。如果将BIOS 比作是一个程序的话,那么EFI

就是一个简化的操作系统。比起传统的BIOS ,EFI BIOS 有更多的扩展性。下图介绍

EFI 引导操作系统的流程。

 

在EFI 系统启动后,GUID 分区表就会被识别,之后EFI 系统就启动Boot Loader 程序加载操作系统内核。对于分区表格式为MBR 分区表的磁盘,EFI 系统会先启动CSM 兼容模式后按传统BIOS 的步骤加载操作系统的内核。如下图。

 

一般的EFI 系统仅能识别FAT32 ,不同于BIOS 只能识别固定位置的磁盘引导块。这意味着只要将引导程序放到FAT32 分区里,EFI  系统就能通过分区表的指引找到这个保存着引导程序的FAT32 分区。

EFI 系统是由模块化的C  语言程序写出来的,所以通过添加或修改程序模块就能获得更多的功能。例如支持更多的文件系统,图形界面,甚至能使用浏览器浏览网页。

 

OS X 的磁盘分区结构

Mac 很早前就使用了EFI ,因此在引导上与上文提到的EFI 引导方式类似。另外,Mac 是使用GUID 分区表 格式的磁盘。结构如下图:

 

 

OS X 是不需要PBR 的,引导是直接从启动分区里找到引导程序加载内核。

 

 

Boot Camp 引导

自从Mac 使用x86 架构以后,在其上面运行Windows 已经成为了可能。苹果在Mac 上开发了一种引导Windows 的技术,叫做Boot Camp 。

在探讨Boot Camp 之前,混合分区表格式需要引起关注。在我们较早前的讨论里得

知,Windows 和OS X 是分别使用两种引导方式的,前者基于传统BIOS ,后者基于EFI

,不幸的是BIOS 是无法引导GPT 磁盘里的操作系统的。为了解决这个问题,混合分区表的概念产生了。                                                                                   GPT 磁盘保留了一个Protect MBR ,在一般情况下这个MBR 是空白的。Mac 开机后EFI 系统直接跳过MBR 读取GPT 分区表。假如我们在这个Protect MBR 上写入分区表和

引导代码后会怎样呢?当EFI 检索到这个磁盘后会加载那个分区表?

带着上面的两个问题,我们来探讨一下。EFI 是一个简化的操作系统,那么可以

通过加载一些特别的程序让它只读GPT 分区表是可能的。同样,让它只读MBR  分区表也是可能的。这就是BootCamp 程序的真面目。

创建混合分区非常简单,使用OS X 的Boot Camp 助理安装Windows 时自动产生。这时

GUID 分区表起始的4个分区就复制到MBR 分区表。不使用Boot Camp 助理也是可以手动创建的,通过磁盘工具在GPT 磁盘上创建一个FAT32 或exFAT 分区后,

系统自动地将GUID 分区表的内容复制到MBR 分区表。

EFI 系统通过加载Nvram 的参数来决定是否启动BootCamp程序。启动过程如下图:

 

双系分区

BootCamp 首先加载磁盘上的MBR 到内存并运行,这时标记为活动的BootCamp 分区

PBR 被找到,接着加载bootmgr 后引导Windows。值得注意的是,GPT 保护分区包含了整个GPT 头和GPT 主体和第一个EFI 系统分区。

 

注意事

MBR  分区表只支持4个主要分区,如果按照一般的情况来安装Windows   的话是不能再添加一个分区的。如果不幸对这个磁盘进行了分区,根据分区的方式会出现如下情况:

 

安 装 Windows                                或 后 将 GPT            保 分 区 格 式 化GPT 保护分区包含从LBA1~LBA409639的所有数据,其中GPT 头和GPT 主体部分都在这里。格式化这个分区意味着磁盘从混合分区表格式变为MBR    分区表格式。尽管两个系统都还能继续启动,但对于OS X 来说是灾难,首先磁盘无法进行动态分区,无法用Boot Camp 助理移除WIndows ,无法更新OS X 等等。

 

 

安装Windows 后在OS X 里添加一个分区

这种做法对于Windows 来说是一个灾难,当在OS X 里添加一个分区后,GPT 分区表会跟MBR 分区表同步,这时GPT 已经有5个分区了,第5个刚好是BootCamp ,所以MBR 分区表自动将BootCamp 踢出去,造成Windows 无法引导。

正确的多分区安装方法必须要在安装OS X 前做好磁盘分区规划。如下表:

 

GPT保护分区Windows 共享1 共享2 OS X Recovery HD

 

从GPT 保护分区开始到共享2会被复制到MBR 分区表,剩下的部分MBR 分区表会识别为可用空间,但是无法使用这片可用空间创建任何分区。

 

对于EFI 启动的操作系统来说,EFI 提供底层硬件的接口,这样的好处在于保护硬件, 而且让驱动的更新更方便。

 

 

传统的BIOS 启动Windows 在BIOS 移交控制权后,Windows 全权掌握硬件服务层。在EFI 主板上使用兼容模式CSM 来启动的Windows 也是类似的。

对比起WIndows 来说,OS X 并不掌握全部的硬件服务,OS X 需要EFI 系统给出的硬件编程接口才能访问硬件。

BootCamp 启动的Windows 则有点特别,与普通EFI 主板上的兼容模式不同,Windows 在访问硬件需要经过EFI 系统。这样做的作用就是EFI 全权控制着WIndows 的硬件访问能力,只要苹果有意,完全可以在驱动上限制Windows 。

从Boot Camp 引导的原理来看,要在Mac 上实现单独安装Windows 是非常简

单的。Boot Camp 程序是固化在EFI 系统里的,所以通过简单设置一下Nvram 的变量, 就可以引导Windows,无需混合分区表格式。修改Nvram  变量需要通过运行在WIndows 下的BootCamp 程序,这意味着,只要装好了苹果提供的BootCamp 驱动,你的Windows 就能运行在Mac 上。更有甚者在第二块磁盘上安装一个完全独立的Windows

,而且是基于纯净的MBR 分区表上安装,这样可以忽略掉与OS X 共享一个磁盘又不能多分区的尴尬。

尽管在Mac 上单独装Windows 也是很简单的,但Mac 本身的EFI 版本比较低,比很多

PC 主板的还低,所以一些较旧的型号甚至连U 盘也不识别。这种旧型号的机器想要用上Windows 得将磁盘拆下接到其它机器上装好系统再装回Mac 。