【问题标题】:Compute The Next Cluster计算下一个集群
【发布时间】:2012-11-30 09:18:35
【问题描述】:

最近我在BrokenThorn 上阅读了一些关于 OS 开发的不错的教程:这是一个不错的 OSDev 系列。

当我想加载我们的引导加载程序的第 2 阶段时,我很难理解“计算下一个集群”的概念。代码是:

      mov     ax, WORD [cluster]  ; The current Cluster.
      mov     cx, ax              ; copy current cluster
      mov     dx, ax              ; copy current cluster
      shr     dx, 0x0001          ; divide by two
      add     cx, dx              ; sum for (3/2)

      mov     bx, 0x0200          ; location of FAT in memory
      add     bx, cx              ; index into FAT
      mov     dx, WORD [bx]       ; read two bytes from FAT

      test    ax, 0x0001

      jnz     .ODD_CLUSTER
      jz      .EVEN_CLUSTER 

为什么我们将当前簇号乘以 3/2 得到下一个簇号?

【问题讨论】:

    标签: assembly x86-16 bootloader osdev fat


    【解决方案1】:

    我在程序集标签中找到了相同的问题,但我找不到它来引用它! (很有帮助)对不起。

    那么,为什么我们将索引乘以 3/2 来获取下一个集群的索引??

    首先我们需要澄清一些想法:

    什么是 FAT 表中的 Enrty??

    是 12 位长的内存和平。所以,FAT 表是这个 Entries 的集合。

    这个条目有什么?

    在这片内存中有一个索引(Number),这个索引指的是同一个FAT表中的一个条目(有多少个Entry从FAT的起始地址开始)。

    每个条目都是 12 位长:

    <---- 12 bits ----><---- 12 bits ----><---- 12 bits ----><---- 12 bits ---->
        1st index          2nd index          3rd index         4th index 
    

    当我们从根目录中得到第一个索引时(例如:4),所以我们应该去 FAT 表中的这个索引找到下一个簇号的索引。我们将如何进行??

    我们需要FAT表的起始地址(很容易找到),并且只需添加索引即可。像这样:

         mov bx, [FAT address]   ; Strat address of FAT table
         mov ax, [cluster]       ;the index (for ex: 4)
         add bx, ax              ;Start address + index = the next Entry (cluster).
    

    简单:-)!!

    但是 3/2 分数在哪里? :-D .
    上面的代码是错误的,为什么?

    逻辑是正确的,但是对“寻址单元”有误解。
    在大多数 CPU 中,单元寻址是 BYTE(8-bits),所以当我们制作 [index] 时,这意味着:index * 8-bits在记忆中。 所以当我们制作 [cluster] ---> index * 8-bits 时,像这样我们将索引 8 位长的条目。

    与此相反,我们的索引是 12 位而不是 8 位!!!那么如何解决这个大问题呢??

    解决方案: 我们应该将 [cluster] 乘以 3/2,所以:
    index * 8bits * 3/2 = index* 12bits。这就是我们需要的!现在我们可以按 12 位单位(1.5 字节)对内存进行索引。
    正确的代码是:

         mov bx, [FAT address]   ; Strat address of FAT table
         mov ax, [cluster]       ;the index (for ex: 4)
         mov dx, ax              ; make copy of index
         shr dx, 0x0001          ; divide it By 2.
         add ax, dx              ; index/2 + index = index * 3/2.
         add bx, ax              ;Start address + index = the next Entry (cluster).
    

    我是新手,所以如果有问题请通知它;-D !!谢谢。

    【讨论】:

      【解决方案2】:

      这种奇怪现象是 FAT12 文件系统特有的。

      由于 FAT12 中簇的记录大小为 12 位,为了计算其在文件分配表中的偏移量(以字节为单位),您需要获取其索引并将其乘以 3/2(或 12 位/8 位) .

      一个簇记录包含文件或文件结束标记的下一个簇的数量(如链表中的指针)。对于免费集群,集群记录可能会标记坏集群或只是免费的。

      【讨论】:

      • 感谢 EarlGray 的回复。我努力寻找并把它弄出来。我想我应该为此做一个教程。大声笑
      【解决方案3】:

      记住这是 FAT12:每个簇都是 12 位。因为一个字节是8位,所以一个条目是一个字节半,也就是3/2字节!

      【讨论】:

        猜你喜欢
        • 2018-05-15
        • 2016-08-23
        • 1970-01-01
        • 2021-04-19
        • 2011-10-16
        • 2021-07-05
        • 2015-01-07
        • 2016-10-27
        • 2017-04-07
        相关资源
        最近更新 更多