Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly how-FAT通过文件';第一个集群是什么?_Assembly_Operating System_Cluster Computing_Bootloader_Fat - Fatal编程技术网

Assembly how-FAT通过文件';第一个集群是什么?

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位数组组成。。怎么做 谢谢。文件的目录

我正在阅读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