0

我正在阅读brokenthorn 的操作系统开发教程

http://www.brokenthorn.com/Resources/OSDev6.html

我坚持了好几天。

加载“stage2.sys”,

搜索根目录“stage2 sys”。

根目录包含文件名和起始集群地址。(即0x002)

加载第 0x002 个簇并查找 FAT 以了解下一个要加载的簇。

FAT由12位数组和

数组大小为 4077

现在,我不知道如何 FAT 让我知道文件的第一个簇加载下一个提示的内容。

问题是这样的。

  1. 有什么遗漏或错误的地方吗?

  2. FAT 如何让我知道通过文件的第一个簇加载下一个簇提示什么?

FAT 仅由 12 位数组组成.. 怎么样?

谢谢。

4

3 回答 3

3

FAT 簇列表只是一个数组,数组中的条目是文件簇链中的下一个索引。目录中的文件条目告诉您第一个集群的位置(在示例中,集群 0x002)。要查找下一个簇,请查看 FAT 数组中的索引 0x002:

next_cluster = FAT[0x002];

例如,如果FAT[0x002]保存为 0x014,则该集群将保存文件的下一组数据,然后您将查找FAT[0x014]第三个集群,等等。

如果您正在处理 12 位 FAT,那么这意味着您在索引数组时会有些复杂。我认为索引类似于

// find the 16-bit word that contains the 12-bit FAT entry
uint16_t tmp = ((uint16_t*)(((char*)FAT) + index + (index / 2)));

// keep either the high 12-bits or low 12-bits depending on if the 
// index is even or odd.
next_cluster = (tmp >> ((index % 2) ? 4 : 0)) & 0x0fff;

当然,这是基于内存中的 FAT。如果从媒体中读取 FAT,则需要将 FAT 适当地转换为要读取的扇区(以及扇区的偏移量)。

于 2011-04-24T04:54:28.093 回答
1

文件的目录条目包含第一个簇号。您可以使用它从磁盘的“数据”部分获取实际的簇,以及FAT 中的下一个簇号。

FAT 中的条目包含文件中下一个簇的簇号。

所以你会有一个目录条目,它可能指示第一个簇号是 22。然后你会去获取簇 22 的数据,并查找簇号 22 的 FAT 条目 - 假设它包含 76。

因此,文件中的下一个簇编号为 76,您遵循相同的过程:获取数据并在 FAT 条目 76 中查找下一个簇编号。

下一个簇号的特殊值表示链已完成,不再可用。我认为(从内存中),这是 FAT12 的 0xFFF 但它可能是一个高值范围。

于 2011-04-24T04:53:39.940 回答
1

FAT 基本上是一个链表。如果文件的开头位于簇 2 中,则要查找下一个簇,请查看 FAT 中的条目 2。这将包含该文件的下一个簇的簇号。您一直按照这些操作,直到找到一个包含大于(从内存中)0ff8h 的数字的数字,这标志着文件的结尾。

顺便说一句,除非您真的准备使用 12 位 FAT,否则 16 位 FAT 更容易处理。

于 2011-04-24T04:54:23.337 回答