[post]第四章 扇区配置
4.1 主扇区配置表
主扇区配置表(MSAT:master sector allocation table)是一个SID数组,指明了所有用于存放扇区配置表(SAT:sector allocation table)的sector的SID。MSAT的大小(SID个数)就等于存放SAT的sector数,在头中指明。
MSAT的前109个SID也存放于头中,如果一个MSAT的SID数多余109个,那么多出来的SID将存放于sector中,头中已经指明了用于存放MSAT的第一个sector的SID。在用于存放MSAT的sector中的最后一个SID指向下一个用于存放MSAT的sector,如果没有下一个则为End Of Chain SID(-2)。
存放MSAT的sector的内容:(s_size表示sector的大小)
Offset Size Contents
0 s_size-4 MSAT的(s_size-4) / 4个SID的数组
s_size-4 4 下一个用于存放MSAT的sector的SID,或-2(已为最后一个)
最后一个存放MSAT的sector可能未被完全填满,空闲的地方将被填上Free SID(-1)。
例:一个复合文档需要300个sector用于存放SAT,头中指定sector的大小为512字节,这说明一个sector可存放128个SID。MAST有300个SID,前109个放于头中,其余的191个将要占用2个sector来存放。此例假定第一个存放MSAT的sector为sector 1,则sector 1包含127个SID。第128个SID指向一个用于存放MSAT的sector,假定为sector 6,则sector 6包含剩下的64个SID(最后一个SID为-2,其他的值为-1)。
4.2 扇区配置表
扇区配置表(SAT:sector allocation table)是一个SID数组,包含所有用户流(短流除外)和内部控制流(the short-stream container stream, 见5.1, the short-sector allocation table, 见5.2, and the directory, 见7)的SID链。SAT的大小(SID个数)就等于复合文档中所存在的sector的个数。
SAT的建立就是通过按顺序读取MSAT中指定的sector中的内容。
存放SAT的sector的内容:(s_size表示sector的大小)
Offset Size Contents
0 s_size SAT的s_size / 4个SID的数组
当通过SAT为一个流创建SID链时,SAT数组的当前位置(array index)表示的就是当前的sector,而该位置存放的SID则指向下一个sector。
SAT可能在任意位置包含Free SID(-1),这些sector将不被流使用。如果该位置包含End Of Chain SID(-2)表示一个流的结束。如果sector用于存放SAT则为SAT SID(-3),同样用于存放MSAT则为MSAT SID(-4)。
一个SID链的起点从用户流的目录入口(directory entry,见6.2节)或头(内部控制流)或目录流本身获得。
例:一个复合文档包含一个用于存放SAT的sector(sector 1)和2个流。
Sector 1的内容如下图:
在位置1其值为-3,表明Sector 1是SAT的一部分。
其中一个流为内部目录流,假定头中指定其开始为Sector 0,SAT中位置0的值为2,位置2的值为3,位置3 的值为-2。因此目录流的SID链为[0, 2, 3, –2],即此目录流存放于3个sector中。
目录中包含一个用户流的入口假定为sector 10,从图中可看出此流的SID链为[10, 6, 7, 8, 9, –2]。