1

最近我在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 得到下一个簇号?

4

3 回答 3

3

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

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

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

FAT 表中的 Enrty 是什么?

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

这个条目有什么?

在这片内存中有一个索引(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 !! 谢谢。

于 2012-12-13T13:22:41.053 回答
1

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

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

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

于 2012-12-12T18:37:05.030 回答
1

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

于 2013-09-25T17:55:14.190 回答