在传统的PowerPC平台的Apple电脑上,采用APM分区管理方式;而在Intel平台上,Apple电脑可以支持APM分区、GPT分区和MBR磁盘分区,但MBR磁盘分区仅应用在外置硬盘或者优盘上,这样可以方便同PC转移数据。
Mac OS X不能从MBR磁盘分区的硬盘上启动系统。
APM即Apple Partition Map(苹果分区映射),是Apple电脑独有的分区结构,最初用在PowerPC平台的Apple电脑上,采用Big-Endian的字节序。虽然从2006年起Apple电脑开始使用Intel所制造的CPU,但APM分区结构依然在使用。
Apple磁盘的第一个扇区
Apple磁盘的第一个扇区既不是引导扇区,也不是分区表,而是一个驱动程序描述符,该描述符中记录着签名值、设备的块大小、设备总块数。
这里所说的设备“块”其实就是指扇区。
另外,驱动程序描述符中还记录了描述符的数目和驱动程序描述符表等,具体结构参数见表6-2。
表6-2 驱动程序描述符的结构参数
字节偏移 | 字段长度(字节) | 字段名和定义 |
0x00~0x01 | 2 | 签名值 |
0x02~0x03 | 2 | 每扇区字节数(即设备的块大小) |
0x04~0x07 | 4 | 扇区总数(即设备的总块数) |
0x08~0x09 | 2 | 设备类型 |
0x0A~0x0B | 2 | 设备ID |
0x0C~0x0F | 4 | 驱动程序数据 |
0x10~0x11 | 2 | 驱动程序描述符个数 |
0x12~0x51 | 64 | 驱动程序描述符表(共8个表项,每项8字节,具体见表6-3) |
0x52~0x1FF | 430 | 未用 |
在驱动程序描述符表中共有8个表项,每个表项占用8字节,描述了驱动程序的开始地址、大小、类型等信息,具体见表6-3。
表6-3 驱动程序描述符表项的结构
字节偏移(相对偏移) | 字段长度(字节) | 字段名和定义 |
0x00~0x03 | 4 | 驱动程序起始扇区 |
0x04~0x05 | 2 | 驱动程序扇区总数 |
0x06~0x07 | 2 | 驱动程序系统类型 |
下面给出一个驱动程序描述符的实例,如图6-1所示。
图6-1 驱动程序描述符扇区
该扇区为一个Apple磁盘0号扇区的部分内容,扇区的后部全部为0数据,在此省略。
这就是一个驱动程序描述符扇区,其参数的具体数值见表6-4。
表6-4 图6-1的驱动程序描述符具体参数值
字节偏移 | 字段长度(字节) | 字段名和定义 | 数值 |
0x00~0x01 | 2 | 签名值 | “45 52” |
0x02~0x03 | 2 | 每扇区字节数(即设备的块大小) | 512 |
0x04~0x07 | 4 | 扇区总数(即设备的总块数) | 143 374 650 |
0x08~0x09 | 2 | 设备类型 | 00 |
0x0A~0x0B | 2 | 设备ID | 00 |
0x0C~0x0F | 4 | 驱动程序数据 | 00 |
0x10~0x11 | 2 | 驱动程序描述符个数 | 4 |
0x12~0x19 | 8 | 驱动程序描述符表项1 | 见表6-5 |
0x1A~0x21 | 8 | 驱动程序描述符表项2 | 见表6-6 |
0x22~0x29 | 8 | 驱动程序描述符表项3 | 见表6-7 |
0x2A~0x31 | 8 | 驱动程序描述符表项4 | 见表6-8 |
0x32~0x39 | 8 | 驱动程序描述符表项5 | 当前未用 |
0x3A~0x41 | 8 | 驱动程序描述符表项6 | 当前未用 |
0x42~0x49 | 8 | 驱动程序描述符表项7 | 当前未用 |
0x4A~0x51 | 8 | 驱动程序描述符表项8 | 当前未用 |
0x52~0x1FF | 430 | 未用 | 00 |
Apple系统使用Big-Endian字节序。
驱动程序描述符表项1的具体参数见表6-5。
表6-5 驱动程序描述符表项1的参数值
字节偏移 | 字段长度(字节) | 字段名和定义 | 数值 |
0x00~0x03 | 4 | 驱动程序起始扇区 | 64 |
0x04~0x05 | 2 | 驱动程序扇区总数 | 23 |
0x06~0x07 | 2 | 驱动程序系统类型 | 01H |
驱动程序描述符表项2的具体参数见表6-6。
表6-6 驱动程序描述符表项2的参数值
字节偏移 | 字段长度(字节) | 字段名和定义 | 数值 |
0x00~0x03 | 4 | 驱动程序起始扇区 | 120 |
0x04~0x05 | 2 | 驱动程序扇区总数 | 36 |
0x06~0x07 | 2 | 驱动程序系统类型 | FFFFH |
驱动程序描述符表项3的具体参数见表6-7。
表6-7 驱动程序描述符表项3的参数值
字节偏移 | 字段长度(字节) | 字段名和定义 | 数值 |
0x00~0x03 | 4 | 驱动程序起始扇区 | 176 |
0x04~0x05 | 2 | 驱动程序扇区总数 | 21 |
0x06~0x07 | 2 | 驱动程序系统类型 | 0701H |
驱动程序描述符表项4的具体参数见表6-8。
表6-8 驱动程序描述符表项4的参数值
字节偏移 | 字段长度(字节) | 字段名和定义 | 数值 |
0x00~0x03 | 4 | 驱动程序起始扇区 | 232 |
0x04~0x05 | 2 | 驱动程序扇区总数 | 34 |
0x06~0x07 | 2 | 驱动程序系统类型 | F8FFH |
驱动程序描述符扇区的结构也可以通过WinHex模板来查看,不过WinHex没有提供该模板,需要自行编写,如图6-2所示。
图6-2 驱动程序描述符模板
APM分区布局
APM分区结构与MBR磁盘分区结构完全不一样,APM分区结构很简单,而且还可以创建任意多个分区,并且分区信息都存放在一些连续的扇区内,这一点也不像MBR磁盘分区的信息那么松散。
APM分区信息是通过分区映射来描述的,分区映射表开始于磁盘的第二个扇区,即1号扇区,映射表中没有引导代码,这一点也跟MBR磁盘分区表不同。分区映射表中的每个映射表项用来描述一个分区,而每个映射表项占用1个扇区,即512字节。
Apple磁盘中的APM分区分为四种类型:第一种是分区映射表分区,用来管理分区映射表自身;第二种是设备的驱动程序分区,用来管理物理设备;第三种是文件系统分区,用来管理操作系统及用户的文件;第四种是空闲空间分区,用来管理未分配的空间。
APM分区的具体结构如图6-3所示。
图6-3 APM分区的结构
APM分区映射表结构
APM分区映射表由若干个映射表项构成,其中第一个映射表项是分区映射表自身的表项,在该表项中记录着分区映射表的总大小以及分区的数目。
分区映射表分区自身的表项起始于Apple磁盘的第二个扇区,并且连续占用若干个扇区。该磁盘中所有分区都在这个映射表中描述,每个分区映射的描述信息称为一个映射表项,占用512字节,这512字节的含义见表6-9。
表6-9 苹果分区表项的含义
下面对各参数进一步解释:
①0x00~0x01:签名值。为分区映射表项的标识符,其值一般为504DH,一些早期版本还在用5453H。
②0x02~0x03:保留。该位置保留不用。
③0x04~0x07:分区个数。用来表示分区的数目。
④0x08~0x0B:分区的起始扇区。记录了该映射表项所描述的分区在当前硬盘中的物理地址。
⑤0x0C~0x0F:分区的总扇区数。记录分区的总大小,以扇区为单位。
⑥0x10~0x02F:分区的名称。记录了该分区的名字,总长度为32字节。
⑦0x30~0x4F:分区类型。该字符串表示存储区的类型,以“Apple_”开头的名字被苹果电脑保留。表6-10表述了Apple电脑常用的标准分区类型。
表6-10 Apple电脑常用的标准分区类型
字符串 | 60含义 |
Apple_partition_map | 该存储区中包含了分区映射表 |
Apple Driver | 该存储区中有设备驱动信息 |
Apple_Driver43 | 该存储区有SCSI管理器4.3的驱动 |
Apple_MFS | 该存储区的文件系统是Macintosh的默认文件系统 |
Apple_HFS | 该存储区的文件系统是HFS |
Apple_UNIX_SVR2 | 该存储区用UNIX的文件系统 |
Apple_PRODOS | 该存储区用ProDOS的文件系统 |
Apple Free | 该存储区没有被使用 |
Apple Scratch | 该存储区为空 |
⑧0x50~0x53:数据区起始扇区号。记录了文件系统数据的逻辑扇区号,此参数将被操作系统所利用,像A/UX之类的操作系统的文件系统并不是从该分区逻辑扇区号0开始的。
⑨0x54~0x57:数据区总扇区数。表示文件系统数据域的大小,以扇区为单位。它和“数据区起始扇区号”的区域衔接起来,因为有些操作系统的文件系统并不是从该分区逻辑扇区号0开始的。
⑩0x58~0x5B:分区的状态。分区的状态是在A/UX系统Macintosh系统中使用的,A/UX系统是Apple电脑较早采用的操作系统,现在已不再使用。分区的状态见表6-11。
表6-11 分区的状态
字符串 | 含义 |
0x00000001 | 分区映射表有效(仅在A/UX系统中使用) |
0x00000002 | 分区已分配(仅在A/UX系统中使用) |
0x00000004 | 分区在使用中(仅在A/UX系统中使用) |
0x00000008 | 分区包含引导信息(仅在A/UX系统中使用) |
0x00000010 | 分区可读(仅在A/UX系统中使用) |
0x00000020 | 分区可写(用于Macintosh和A/UX) |
0x00000040 | 引导代码位置独立(仅在A/UX系统中使用) |
0x00000100 | 分区包含链式兼容的驱动器(仅在Macintosh系统中使用) |
0x00000200 | 分区包含一个实际的驱动器(仅在Macintosh系统中使用) |
0x00000400 | 分区包含一个链式驱动器(仅在Macintosh系统中使用) |
0x40000000 | 启动时自动加载(仅在Macintosh系统中使用) |
0x80000000 | 启动分区(仅在Macintosh系统中使用) |
⑪0x5C~0x5F:引导代码起始扇区。包含引导代码第一个扇区的逻辑地址。
⑫0x60~0x63:引导代码扇区数。记录引导代码的大小。
⑬0x64~0x67:引导代码装载地址。记录了引导代码在内存中的驻留位置。
⑭0x68~0x6B:保留。
⑮0x6C~0x6F:引导区装载指针。当在内存中读取了引导代码后,启动程序获得控制权,它记录了该程序在内存中的位置。
⑯0x70~0x73:保留。
⑰0x74~0x77:引导代码校验和。记录了引导代码的检测次数。启动文件在读取了代码后计算出检测次数与该值进行比较。
⑱0x78~0x87:处理器类型。一组可选的字符串,当处理器执行引导代码时,用来标示该处理器的类型。已知的处理器型号有68 000、68 020、68 030和68 040。
⑲0x88~0x1FF:保留。
分区映射表分区
下面来看一个分区映射表分区的实际例子,它的映射表项位于Apple磁盘的1号扇区,其部分内容如图6-4所示。
图6-4 分区映射表分区自身的表项
这就是Apple磁盘APM分区映射表的第一个表项,也就是描述分区映射表自身的一个表项。
Apple系统使用Big-Endian字节序。
分区映射表的结构也可以通过WinHex模板来查看,不过WinHex中没有提供该模板,需要自行编写,如图6-5所示。
图6-5 分区映射表的结构模板
驱动程序分区
Apple电脑用给每个驱动器创建分区的方式来管理这些驱动器设备,所以在苹果系统的主磁盘中有很多为驱动器创建的分区。
在本例中的Apple磁盘中,有6个设备的驱动程序分区。这里选择一个ATA硬盘的驱动程序分区为例进行讲解,它的映射表项位于Apple磁盘的5号扇区,其部分内容如图6-6所示。
图6-6 ATA硬盘驱动程序分区的映射表项
这就是Apple磁盘APM分区映射表的第五个表项,用来描述Apple电脑中的一块ATA硬盘,该表项中的具体数值如图6-7所示。
图6-7 驱动程序分区的映射表项模板
文件系统分区
Apple电脑的文件系统分区用来管理操作系统及用户的文件。Apple磁盘中一般有一个到多个文件系统分区。
在本例中的Apple磁盘中,只有1个文件系统分区,它的映射表项位于Apple磁盘的9号扇区,其部分内容如图6-8所示。
图6-8 文件系统分区的映射表项
这就是Apple磁盘APM分区映射表的第九个表项,用来描述Apple电脑中的一个文件系统分区,该表项中的具体数值如图6-9所示。
图6-9 文件系统分区的映射表项模板
空闲空间分区
Apple电脑的空闲空间分区用来管理未分配的磁盘空间。因为磁盘中的所有空间不一定都分配给分区使用,往往还会剩余一部分,这部分就用一个空闲空间分区进行管理。
在本例中的Apple磁盘中也有1个空闲空间分区,它的映射表项位于Apple磁盘的10号扇区,其部分内容如图6-10所示。
图6-10 空闲空间分区的映射表项
这就是Apple磁盘APM分区映射表的第十个表项,也是最后一个表项了,它用来描述Apple磁盘中的未分配空间,该表项中的具体数值如图6-11所示。
图6-11 空闲空间分区的映射表项模板