来个FAT表尝尝。
FAT表
从前面的文章里,可以推算FAT表的地址是0x1B4000。
- 它是一个表就会有表项,从这个地址开始,每32位是一个表项,所以下图中有12个表项
- 除了前两个表项,一个表项对应一个簇的使用情况
- 0号和1号表项是一些文件系统相关信息,并不对应任何簇,所以就可以解释为什么有效簇号要从2开始,就是因为0、1表项被用作它用了,2号表项才开始对应簇
- 表项(除0、1)里的值正常情况下有3种,分别是文件的中间簇、文件的结尾簇、空闲簇。是的,不存在开头簇,因为和中间簇是一样的,下文体会。
FAT表机制
下面通过完全读取一个文件来理解FAT表的原理。根据前面的文章,我们可以找到文件内容的第一个簇。
这时有两种情况
- 文件内容大小不足一个簇,那么这个簇,即是第一个簇,又是最后一个簇,这个簇对应的FAT表项值就是
FF FF FF 0F
- 文件内容大小占用若干个簇,那么这个簇仅仅是第一个簇,后面的内容在哪些簇还不知道
这种情况下,FAT表的机制就要起作用了。
举例
假设把一个大文件按簇大小切成N块,分别存储到簇号为Cn(n=1,2...N)的簇中,则其内容和FAT表如下
文件内容块编号 | 1 | 2 | ... | N-1 | N |
---|---|---|---|---|---|
存储簇号 | C1 | C2 | ... | CN-1 | CN |
FAT表内容 | C2 | C3 | ... | CN | FF FF FF 0F |
因此,读取一个文件的过程可以是这样的
- 簇号为起始簇
- 找到簇,读出内容
- 查看当前簇的FAT表项的值
如果不是文件的结尾簇,就令簇号为表项值,走到过程2
如果是文件的结尾簇,文件读取完毕