Assembly how-FAT通过文件';第一个集群是什么?
我正在阅读brokenthorn的操作系统开发教程 我坚持了好几天 要加载“stage2.sys” 搜索根目录“stage2 sys” 根目录包含文件名和起始群集地址。(即0x002) 加载0x002th集群并查找下一个要加载的集群的FAT FAT由12位数组和 数组大小为4077 现在,我不知道如何通过文件的第一个集群让我知道下一个提示加载什么 问题是这样的Assembly how-FAT通过文件';第一个集群是什么?,assembly,operating-system,cluster-computing,bootloader,fat,Assembly,Operating System,Cluster Computing,Bootloader,Fat,我正在阅读brokenthorn的操作系统开发教程 我坚持了好几天 要加载“stage2.sys” 搜索根目录“stage2 sys” 根目录包含文件名和起始群集地址。(即0x002) 加载0x002th集群并查找下一个要加载的集群的FAT FAT由12位数组和 数组大小为4077 现在,我不知道如何通过文件的第一个集群让我知道下一个提示加载什么 问题是这样的 有没有遗漏或错误的地方 如何通过文件的第一个集群让我知道加载下一个集群提示的内容 FAT仅由12位数组组成。。怎么做 谢谢。文件的目录
谢谢。文件的目录条目包含第一个群集编号。您可以使用它从磁盘的“数据”部分获取实际集群,再加上FAT中的下一个集群编号 FAT中的条目包含文件中下一个集群的集群编号 因此,您将有一个目录条目,它可能指示第一个集群编号是22。然后,您将获取集群22的数据,并查找集群编号22的FAT条目——假设为76 因此,文件中的下一个集群是76号,您遵循相同的过程:获取数据并在FAT条目76中查找下一个集群号
下一个簇号的特殊值表示链已完成,不再可用。我认为(从内存来看),FAT12的值是0xFFF,但可能是一个高值范围。文件的目录项包含第一个群集号。您可以使用它从磁盘的“数据”部分获取实际集群,再加上FAT中的下一个集群编号 FAT中的条目包含文件中下一个集群的集群编号 因此,您将有一个目录条目,它可能指示第一个集群编号是22。然后,您将获取集群22的数据,并查找集群编号22的FAT条目——假设为76 因此,文件中的下一个集群是76号,您遵循相同的过程:获取数据并在FAT条目76中查找下一个集群号
下一个簇号的特殊值表示链已完成,不再可用。我认为(根据记忆),这是FAT12的0xFFF,但可能是一个高值范围。FAT基本上是一个链表。如果文件的开头在集群2中,那么要查找下一个集群,请查看FAT中的条目2。它将包含该文件的下一个群集的群集号。按照这些步骤进行操作,直到找到一个包含大于(从内存中取出)0ff8h的数字,该数字表示文件结束
顺便说一句,除非你真的打算使用12位脂肪,否则16位脂肪更容易处理。脂肪基本上是一个链表。如果文件的开头在集群2中,那么要查找下一个集群,请查看FAT中的条目2。它将包含该文件的下一个群集的群集号。按照这些步骤进行操作,直到找到一个包含大于(从内存中取出)0ff8h的数字,该数字表示文件结束
另一方面,除非您真的打算使用12位FAT,否则16位FAT更容易处理。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群集列表只是一个数组,数组中的条目是文件群集链中的下一个索引。目录中的文件条目告诉您第一个集群的位置(在示例中为集群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是从介质读取的,则需要将相应的转换为要读取的扇区(并将偏移量转换为扇区)。首先,谢谢。以下概念正确吗?“如果根目录显示文件的第一个群集为0x002,则加载第三个群集,对于加载下一个群集,请查找FAT的第三个12位项目(从24位到36位),如果显示0x06,则加载第七个群集并查找FAT的第七个12位项目(从72位到84位),如果它说该值大于或等于0xff8且小于或等于0xfff,则表示“首先,谢谢”。以下概念正确吗?“如果根目录显示文件的第一个集群为0x002,则加载第三个集群,对于加载下一个集群,查找FAT的第三个12位项目(24位到36位),如果显示0x06,则加载第七个集群并查找FAT的第七个12位项目(72位到84位),如果显示val