盘区溢出文件是HFS+文件系统的元文件之一,它的作用是描述8个盘区以外的分支的盘区信息。
HFS+文件系统用“块”为基本单位存储数据,连续的一组块称为一个“盘区”。文件的分支由若干个盘区组成,如果文件连续存放,分支中就只有一个盘区;如果文件有碎片,则分支中会有多个盘区。
在编录文件的文件记录中描述了分支的前8个盘区的信息。如果文件的碎片过多,超过了8个,那么从第9个盘区开始往后的盘区信息则需要盘区溢出文件进行描述。
盘区溢出文件的头节点
盘区溢出文件分析也采用B−树结构组织数据。B−树中第一个节点同样是头节点,其结构与编录文件的头节点结构一样。这里给出一个实例,如图6-50所示。
图6-50 盘区溢出文件的头节点实例
对于该头节点的结构就不重复分析了,这里给出其模板,读者可以对照分析,如图6-51所示。
图6-51 盘区溢出文件的头节点模板
盘区溢出文件的关键字
在盘区溢出文件B−树的叶节点中,同样由节点描述符和数据记录构成,我们把它的数据记录称为盘区记录。盘区记录中包含关键字及关键字的数据。
盘区溢出文件的关键字结构见表6-40。
表6-40 盘区溢出文件的关键字结构
字节偏移(相对偏移) | 字段长度(字节) | 字段名和定义 |
0x00~0x01 | 2 | 关键字长度 |
0x02~0x02 | 1 | 分支类型,0为数据分支;1为资源分支 |
0x03~0x03 | 1 | 保留 |
0x04~0x07 | 4 | 文件的CNID |
0x08~0x0B | 4 | 起始虚拟块号(VBN) |
下面对各参数进一步解释:
①0x00~0x01:关键字长度。该参数长度都用两个字节描述,并且关键字的长度总是取头节点中定义的最大长度,也就是10个字节。
②0x02~0x02:分支类型。该参数用以说明盘区记录中描述的分支是数据分支还是资源分支。该值为0表示数据分支;该值为1表示资源分支。
③0x03~0x03:保留。
④0x04~0x07:文件的CNID。描述当前盘区记录所在文件的CNID,通过此ID可知当前的盘区属于哪个文件的分支。
⑤0x08~0x0B:起始虚拟块号(VBN)。该参数是指盘区记录描述的第一个盘区内存放的数据在文件内的块编号。该参数这样理解:将一个文件占用的所有块从0开始编号,不管文件是否有碎片,编号都顺序进行,这样的编号就称为该文件的虚拟块号(VBN),类似于NTFS的VCN。
再用一个实例进行分析,如图6-52所示。
图6-52 盘区溢出文件的关键字实例
图6-52中的内容是盘区溢出文件的一个叶节点的部分截图,在节点描述符的08H偏移处的值为“FF”,换算成十进制等于“−1”,说明是个叶节点。图中关键字的结构及数值见表6-41。
表6-41 图6-52中关键字的结构及取值
字节偏移(相对偏移) | 字段长度(字节) | 字段名和定义 | 实际值 |
0x00~0x01 | 2 | 关键字长度 | 10,说明关键字占用10个字节 |
0x02~0x02 | 1 | 分支类型。0为数据分支;1为资源分支 | 0,说明是数据分支 |
0x03~0x03 | 1 | 保留 | 0 |
0x04~0x07 | 4 | 文件的CNID | 58,说明当前是58号ID文件的盘区信息 |
0x08~0x0B | 4 | 起始虚拟块号(VBN) | 20992 |
盘区溢出文件的关键字数据
盘区溢出文件关键字数据的结构采用分支数据结构,具体见表6-42。
表6-42 盘区溢出文件关键字数据的结构
再给出一个实例进行分析,如图6-53所示。
图6-53 盘区溢出文件关键字的数据实例
图6-53中关键字的数据结构及数值如图6-54所示。
图6-54 盘区溢出文件数据记录的模板
盘区溢出文件关键字的每个数据记录包含8个盘区的描述信息。一个文件分支的前8个盘区信息存放在编录文件的数据记录中,8个以后的盘区信息放在盘区溢出文件中。如果文件碎片太多,一个盘区记录还是不能完全描述,还可以继续分配更多的盘区记录。
根据上面的分析,如果我们知道一个文件的盘区总数,就可以算出其盘区记录的个数,计算方法:(盘区总数−8+7)DIV 8。该计算式的含义解释如下:
用盘区总数减去8是因为前8个盘区信息存放在编录文件的数据记录中,如果盘区的总数少于8个就不需要盘区记录存放多余的信息了。盘区总数减8后再加上7是因为后面做的是取整运算,加7可以保证结果非零。