/9/14 (学习日记)(FAT12文件簇链的寻找)

时间:2024-04-09 11:14:48

ax: AX是累加器,常用来存储算术逻辑运算中的操作数或结果,另外所有I/O指令都需要使用累加器与外设接口传递数据

bx: 称为基址寄存器,常用来存放访问内在时的基地址,

cx:称为计数寄存器,在循环和串操作指令中用作计数器

dx:称为数据寄存器,在寄存器间接寻址中的I/O指令中存放I/O端口的地址

cld(clear director):清空方向标志位DF(Direction Flag),进行串操作时,SI,DI递增一或二。

std(set director):将DF设置为1。当进行串操作时,SI,DI,递减一或二。


对orange‘s一个操作系统的实现第四章第一节用FAT表和根目录区寻找文件簇链的方法理解:

参考http://dengqi.blog.51cto.com/5685776/1349327

FAT12,意思是一个FAT项占12位也就是1.5个字节,《一个操作系统的实现》这本书上用下图来说明FAT项的排列情况:

2017/9/14 (学习日记)(FAT12文件簇链的寻找)

乍一看感觉很简单啊,但我就在这儿吃了个亏。

比如我来考考考你:

F0 FF 0F,这是两个FAT 项,左低右高,那么第一个第二个FAT项分别是什么?

我相信大部分人看到上面那张图后都会说,第一个是F0F,第二 个是F0F,那么恭喜你,你和我犯了一样的错误

正确答案是 FF0, 0FF。

注意了    F0是BYTE1, FF是BYTE2, 0F是BYTE3 不假,但是 每个字节中高位低位的顺序和字节与字节之间高位与低位的顺序是相反的!!!

所以 F0 FF 0F 要真分起来的话,第二个字节中的右边的F要插入到第一个字节的最右边成为第一个FAT项的最高四位;第二个字节的左边的F要插入到第三个字节的最右边,成为第二个FAT项的最低四位,故答案是FF0 0FF。


现在拿书上的例子来说明:

对于FAT12系统而言,FAT2是FAT1的拷贝,紧跟其后是根目录区:

2017/9/14 (学习日记)(FAT12文件簇链的寻找)

根目录的条目格式为

2017/9/14 (学习日记)(FAT12文件簇链的寻找)

一个条目占32字节。

我们可以看到RIVER TXT 文件的文件大小为00 00 00 11(倒着看),该文件的起始簇号为002。

FLOWER TXT 文件的大小为00 00 60 A9,该文件的起始簇号为 003。

我们现在来从FAT12表中寻找这两个文件的簇链。

FAT12表的内容如下:


2017/9/14 (学习日记)(FAT12文件簇链的寻找)


我们可以看到在offset 0000200处的FAT项分别为:FF0 FFF FFF 008  FFF FFF FFF FFF 009 00A FFF 000.....

第0个和第1个FAT项是不使用的。RIVER TXT 的簇号是002,值为 FFF ,(0x000-0xFF6,表示下一个簇的位置,0xFF7表示坏簇,0xFF8-0xFFF表示这个簇已经是最后一个。)

说明RIVER TXT文件存在第二个簇。

FLOWER文件的起始簇号为003,值是 008表示下一个簇号是8,值为009,表示下一个簇号是9,值为00A表示下一个簇号为10,值为FFF,表示结束。

所以FLOWER 文件 占 3 8 9 10四个簇。



(虽然搞清楚了,但感觉还是没什么卵用,这些知识以后搞文件恢复的时候能用上,但呵呵,有几个人学编程以后去搞文件恢复呢?呵呵)