2

我正在为 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的页面末尾。

4

2 回答 2

3

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

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

于 2013-02-09T16:29:52.890 回答
1

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

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

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

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

于 2013-02-09T07:05:49.907 回答