存档

2011年10月 的存档

说一说FAT12这个文件系统

2011年10月31日 2 条评论

今天忽然看到了PEPROCESS这个东西,感到好亲切啊。

FAT的参考资料:http://en.wikipedia.org/wiki/File_Allocation_Table

对于一个FAT的分区/磁盘(通常来说都是分区,但是软盘上没有MBR,所以这时候就是磁盘了),一开始是一个引导扇区(DBR),里面包含了一些引导代码和BIOS参数块(BIOS Parameter Block,BPB)。
这个DBR以及接下来的一些特殊用途的扇区(如果存在的话)都算在BPB中的NumberOfReservedSectors里面。

接下来是FAT,FAT可能有多个副本。位于BPB的NumberOfFats。每个FAT占用的扇区数位于BPB的NumberOfSectorsPerFat。
FAT其实是一个(元素大小为12位的)数组,这个数组的元素下标是磁盘上的簇号,每个元素都指向另外一个元素的位置(也就是另外一个下标——也就是簇号),形成一个链表。
簇的定义是一些连续的扇区,具体有多少个取决于BPB中的NumberOfSectorsPerCluster。
比如说有个文件在磁盘上,按顺序一次占据了簇号为5、3、10、7的四个簇(注意FAT的第0和第1个元素被留作它用(第0个是BPB的0x15处的那个媒介描述符——因为这个描述符只有8位,所以高位补1,第1个是用来标识链表结束(End of Clusterchain,EOC)的),因此不存在簇0和簇1)。
那么Fat[5] = 3、Fat[3] = 10、Fat[10] = 7、Fat[7] = EOC。(注意Fat不是字符型,而是一种12-bit的类型)
不过实际实现中,其实不是用第0个元素来判断EOC的,只要大于0xff0都是EOC(参考wiki)。
如果FAT中某个元素为0,那么说明这个簇是空闲的。
注意从簇转换到扇区号应当是(ClusterNumber – 2) * NumberOfSectorsPerCluster + 数据区起始位置(参考后文)。

然后是根目录。根目录其实是一个元素为0x20大小的数组,元素个数取决于BPB中的RootEntries。这些元素也就是一个个的文件描述符。每个元素前11字节是8.3格式的文件名(不含点号,如果不够8/3的长度,用空格补齐。另外,长文件名(Long File Names,LFN)其实是用利用不合法的文件项实现的——一种只读、系统、隐藏的卷标型文件,然后利用项中的其他(绝大多数)域专门存文件名——这种不合法的文件项会重复多次(如果文件名很长),然后紧接着是这个LFN对应的真正的文件项),然后是文件属性(隐藏/系统/只读等),接下来是一些日期时间(创建/最后修改)等,接下来在偏移0x1a处标识了文件的第一个簇号。紧接着是文件大小。

最后就是数据区了。(也就是前面从簇转换到扇区号所用的那个起始位置。)

这才是第一篇日志

2011年10月25日 1 条评论

推荐使用支持HTML5(虽然实际上博客页面是XHTML 1.1的……)的浏览器。
推荐使用768p分辨率访问。
为了获得更好的显示效果,建议您同时安装Segoe UI以及Microsoft YaHei字体。

注:IE9下某些控件的字体选择存在BUG。