转换存储在FAT表(FAT12文件系统)中的簇号,以便从软盘读取

时间:2013-02-09 06:52:27

标签: assembly filesystems bootloader fat

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

我的困惑在于,在本教程中,从FAT获得的簇编号首先转换为LBA(线性块地址)格式,然后在将扇区读入存储器之前转换为CHS(圆柱头扇区)格式。

为什么我不能直接将群集号转换为CHS格式? FAT表是否不能线性存储簇号?我想知道我到底错过了什么?

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

2 个答案:

答案 0 :(得分:2)

群集号是线性的,但是 - 如前所述 - 是相对于数据区域的,群集2是数据区域的第一个群集。但是,从磁盘读取的是磁盘扇区,每个FAT群集可能包含多个扇区 - 这是转换为LBA的目的 - 从群集号转换为扇区号(因此,从所需的群集号中减去2 - 考虑群集2是数据区的第一个群集,然后乘以每个群集的磁盘扇区数,然后在数据区之前添加正在使用的磁盘扇区数,提出存储数据的绝对磁盘扇区。

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

答案 1 :(得分:1)

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

群集号OTOH仅在分区内有意义,它相对于分区的开头(其数据区域),并且它可以唯一地识别分区中多个扇区的块。

所以,这两件事之间存在很大差异,尽管它们的功能相似。

硬件(或BIOS)不会也不应该对集群有任何了解。因此,您必须将群集编号转换为LBAs(然后可能转换为CHS)才能访问存储设备上的数据。