【问题标题】:How to access the CHS information from the partition table of MBR?如何从 MBR 的分区表中获取 CHS 信息?
【发布时间】:2017-05-04 17:07:36
【问题描述】:

我正在创建一个基本的 MBR,它读取分区表并加载可引导分区的第一个扇区。我对 CHS 和 LBA 寻址模式感到困惑。我在一个教程中读到除了兼容性原因外,CHS 或多或少都没有使用。 所以,我选择使用 LBA(INT 13h 扩展)。要加载驱动器的扇区,我必须从该分区的分区表中读取 CHS 值。只有这样我才能将其转换为 LBA 并将其存储在“磁盘地址包”中。

我的疑问是,分区表中的 CHS 每个是 1 个字节。我应该直接取这个值并将其转换为 LBA(或)我必须先将其转换为,

Cylinder = 10 bits
Sector   = 6 bits
Head     = 8 bits

然后转换成LBA?

注意:我的 MBR 必须能够访问 HDD 和 USB 上的扇区 - 这就是动机。

操作系统:Ubuntu

汇编器:气体

【问题讨论】:

  • 是的,你需要做 10 位/6 位的事情。见osdev wiki
  • 再一次,最终的 CHS 将是每个 ri8 1 字节?

标签: assembly operating-system kernel x86-16 mbr


【解决方案1】:

Partition table entries 仅将 CHS 用于向后兼容非常旧的操作系统。
它们还有 LBA 地址字段:

 

 

请注意,这里使用 LBA32,因此分区大小和位置有限制。引用维基百科:

由于块地址和大小使用 32 位存储在 MBR 的分区表中,因此使用具有 512 字节扇区(实际或模拟)的驱动器的分区的最大大小和最高起始地址不能超过 2 TiB-512 字节(2,199,023,255,040 字节或 4,294,967,295 (232-1) 个扇区 × 512 (29) 个字节/扇区)。[2]缓解这种容量限制是开发 GPT 的主要动机之一。

CHS 寻址也是如此。
使用 CHS 字段的操作系统的大小限制约为 8 GiB。
因此,如果您想与它们兼容,则需要保持在该限制之下。


LBA转换公式 CHS可以很容易推导出或者网上找到,可以根据扇区号(即LBA)来考虑,在创建分区条目的时候转换成CHS(或者使用默认的1023, 255、63 管分区对于 CHS 来说太大)。

行的底部,使用 LBA 字段。
或者去GPT

【讨论】:

  • 那么,要从硬盘加载一个扇区(比如说),我可以使用 INT 13h 扩展的分区表的“起始扇区”吗?据我所知,“起始扇区”值相当于分区ri8的起始LBA值?
  • 是否同样适用于使用笔式驱动器启动?(我的意思是,只要 BIOS 支持,它们都可以使用 LBA 寻址模式吗?)
  • @PantherCoder 是的,INT13h 抽象了特定设备的详细信息,因此您只需为其提供驱动器号和扇区地址。它提供了一个标准接口。不过,您应该使用 INT13h 扩展,它们更好。
猜你喜欢
  • 2019-03-11
  • 2013-03-17
  • 2023-03-23
  • 1970-01-01
  • 2014-10-19
  • 2015-12-23
  • 2022-10-03
  • 2022-12-05
  • 2013-03-15
相关资源
最近更新 更多