【问题标题】:how FAT let me know what to load next cluster hint by file's first cluster?FAT 如何让我知道通过文件的第一个簇加载下一个簇提示什么?
【发布时间】:2011-08-11 17:44:31
【问题描述】:

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

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

我坚持了好几天。;

加载“stage2.sys”,

搜索根目录“stage2 sys”。

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

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

FAT由12位数组和

数组大小为 4077

目前,我不知道如何 FAT 让我知道要通过文件的第一个簇加载下一个提示。

问题是这样的。

  1. 是否有遗漏或错误的地方?

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

FAT 只包含 12 位数组。如何?

谢谢。

【问题讨论】:

    标签: assembly operating-system cluster-computing bootloader fat


    【解决方案1】:

    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 适当地转换为要读取的扇区(以及该扇区的偏移量)。

    【讨论】:

      【解决方案2】:

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

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

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

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

      下一个簇号的特殊值表示链已结束,没有更多可用了。我认为(从内存中),这是 FAT12 的 0xFFF 但它可能是一个高值范围。

      【讨论】:

      • 首先,谢谢。下面的概念对吗? “如果根目录说文件的第一个簇是 0x002,则加载第 3 个簇并加载下一个簇,查找 FAT 的第 3 个 12 位项(第 24 位到 36 位),如果它说 0x06,则加载第 7 个簇并查找 FAT 的第 7 个 12 位项(第72位到第84位),如果大于等于0xff8且小于等于0xfff,则为簇尾"
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-20
        • 1970-01-01
        • 2013-12-26
        • 2013-07-28
        相关资源
        最近更新 更多