关于汇编:将存储在 FAT 表(FAT12 文件系统)中的簇号转换为从软盘读取

Converting the cluster number stored in FAT table (of FAT12 filesystem) for reading from a floppy disk

我正在为 FAT12 文件系统编写一个两阶段引导加载程序。引导加载程序的 stage1 从 FAT12 文件系统中的软盘加载 stage2。现在我在将簇号(我从 FAT 表中获得)转换为包含磁道、磁头和扇区号的格式时遇到问题。我正在按照教程 http://www.brokenthorn.com/Resources/OSDev6.html 制作引导加载程序。

我的困惑是,在教程中,从 FAT 获得的簇号首先转换为 LBA(线性块地址)格式,然后转换为 CHS(气缸盖扇区)格式,然后再将扇区读入内存。

为什么不能直接将Cluster Number转换成CHS格式?? FAT表不是线性存储簇号吗?我想确切地知道我在这里缺少什么??

教程中使用的引导加载程序的源代码链接在链接页面的末尾http://www.brokenthorn.com/Resources/OSDev6.html。


簇编号是线性的,但 - 如前所述 - 与数据区域相关,簇 2 是数据区域的第一个簇。然而,从磁盘读取数据是根据磁盘扇区进行的,每个 FAT 簇可能包含多个扇区——这就是转换为 LBA 的目的——从簇号转换为扇区号(因此,从所需簇数 - 考虑簇 2 是数据区的第一个簇,然后乘以每个簇的磁盘扇区数,然后在数据区之前加上正在使用的磁盘扇区数,得出绝对值存储数据的磁盘扇区。

旧的 BIOS int 0x13 函数并没有从磁盘中读取绝对扇区 - 它们读取特定磁头上特定柱面的特定扇区 (http://en.wikipedia.org/ wiki/气缸盖扇区)。因此,如果您使用这些功能,您需要采取额外的步骤来确定哪个柱面/磁头/扇区对应于您要读取的绝对扇区。另一种方法是 - 如果可用 - 使用扩展读取 int 0x13 函数,该函数直接获取绝对扇区 (LBA) 地址。


LBACHS 用于唯一标识磁盘上的所有物理扇区。

簇号OTOH仅在分区内有意义,它相对于分区的开头(其数据区域),它可以唯一标识分区内多个扇区的块。

所以,尽管它们的功能相似,但两者之间还是有很大区别的。

而硬件(或 BIOS)不知道也不应该知道关于集群的任何事情。因此,您必须将簇号转换为 LBAs(然后可能转换为 CHS)才能访问存储设备上的数据。