INT 13h 有效扇区大小

INT 13h effective sector size

我正在编写自己的引导加载程序。我希望利用 int 13h,02h 从引导驱动器读取扇区。我正在参考 https://en.wikipedia.org/wiki/INT_13H 以获取有关此 bios 中断的文档。

我发现的大多数参考代码都假设扇区的大小仅为 512 字节,尽管存在其他大小(非标准大小,例如 520 字节扇区和 4096 字节扇区)。我发现的一些来源似乎表明 BIOS 将始终将一个扇区模拟为 512 字节,而不管底层大小 (LBA and sector size), and some appear to indicate that this is not the case (https://www.reddit.com/r/osdev/comments/ajfmtf/is_the_sector_size_for_bios_int_13h_ah2_always/),尽管我发现没有任何来源提供支持这一事实的决定性文档。

我知道我可以使用 int 13h,48h 来读取有关驱动器参数的信息,但是我仍然不确定这个中断返回的“扇区大小”是否会被使用,或者是否BIOS 将自动模拟 512 字节的扇区。除此之外,不能保证每个平台都支持 int 13h,48h(我相信)。链接的参考似乎暗示后者:“假设您要读取 16 个扇区(= 2000h 字节)”。

如果可能,我正在寻找以下内容:

  1. 扇区大小实际用于非标准扇区大小的驱动器,以及支持此答案的具体文档。
  2. 如果实际上使用的是非标准尺寸,有没有办法不依赖 int 13h,48h 来确定这个值?

找出答案的一种方法是查看现有引导加载程序的代码(例如 Linux),因为它们也必须处理这些代码。也就是说,如果存在一个不支持 512 字节读取并且默认情况下不处于该模式的硬盘,我会非常非常非常惊讶。

In addition to this, int 13h,48h is not guaranteed to be supported on every platform (I believe).

所以我想安全的方法是尝试 INT 13h,48h;如果支持,则使用该值;如果不支持,则假定为 512 字节(因为如果 BIOS 支持其他读取大小,它也应该支持 INT 13h、48h)。

non-standard sizes such as 520-byte sectors

我从事计算机编程已有 40 多年,但我从未见过使用 520 字节扇区的单一设备。虽然有复古计算机,您可以选择对软盘做任何您想做的事情,但 PC 软盘控制器只允许扇区大小为 2 的幂,例如 256、512、1024、2048、4096 等。而且您无法更改这完全在硬盘上。

所以我真的很好奇你发现什么设备有 520 字节的扇区?

所有非扩展BIOS disk services like Int 13h/AH=2h, Int 13h=AH=3h等都假定为512字节扇区。如果底层媒体碰巧使用更大的磁盘扇区大小,则会完成转换。

扇区大小将是 512 字节的倍数,以与旧版 BIOS 兼容。在 IBM-PC 的早期,有一些驱动器支持深奥的扇区大小,但它们需要使用 BIOS 提供的不同服务来使用或需要直接访问驱动器(通过 IO 端口等)。实际上,您需要特殊的硬件才能使用此类设备,或者您需要编写专门为这些设备编写的代码。

某些类型的 SCSI 设备(包括 SAS SSD)在最低级别使用 520 字节扇区,但您通常需要擦除驱动器并重新格式化以使用一些标准扇区大小,即 512 的倍数大多数软件和操作系统都能理解的字节。这通常涉及直接向驱动器发出 SCSI 命令。在 Linux sg_format 中可以用来做这种低级操作。这些类型的驱动器通常也需要专门的控制器。

扩展的 BIOS 磁盘服务,如 Int 13h/AH=42h and Int 13h/AH=43h,没有做出任何扇区大小固定为 512 字节的假设。在任何支持扩展磁盘 BIOS 服务的驱动器上,您都可以查询驱动器参数以确定磁盘扇区大小。

如果发现驱动器支持扩展 BIOS 磁盘服务,您可以在引导加载程序 运行 时确定扇区大小。有关如何检查 BIOS 和驱动器是否支持这些扩展的信息,请参阅 附加说明 。如果 BIOS 和驱动器确实支持它们,那么您可以使用 Int 13h/AH=48h 查询磁盘扇区大小:

IBM/MS INT 13 Extensions - GET DRIVE PARAMETERS
AH = 48h
DL = drive (80h-FFh)
DS:SI -> buffer for drive parameters (see #00273)

Return:
CF clear if successful
AH = 00h
DS:SI buffer filled
CF set on error
AH = error code

[snip]

Format of IBM/MS INT 13 Extensions drive parameters:

Offset  Size    Description     (Table 00273)
00h    WORD    (call) size of buffer
(001Ah for v1.x, 001Eh for v2.x, 42h for v3.0)
(ret) size of returned data
02h    WORD    information flags (see #00274)
04h    DWORD   number of physical cylinders on drive
08h    DWORD   number of physical heads on drive
0Ch    DWORD   number of physical sectors per track
10h    QWORD   total number of sectors on drive
**18h    WORD    bytes per sector**
---v2.0+ ---
1Ah    DWORD   -> EDD configuration parameters (see #00278)
FFFFh:FFFFh if not available
---v3.0 ---
1Eh    WORD    signature BEDDh to indicate presence of Device Path info
20h    BYTE    length of Device Path information, including signature and this
byte (24h for v3.0)
21h  3 BYTEs   reserved (0)
24h  4 BYTEs   ASCIZ name of host bus ("ISA" or "PCI")
28h  8 BYTEs   ASCIZ name of interface type
"ATA"
"ATAPI"
"SCSI"
"USB"
"1394" IEEE 1394 (FireWire)
"FIBRE" Fibre Channel
30h  8 BYTEs   Interface Path (see #00275)
38h  8 BYTEs   Device Path (see #00276)
40h    BYTE    reserved (0)
41h    BYTE    checksum of bytes 1Eh-40h (two's complement of sum, which makes
the 8-bit sum of bytes 1Eh-41h equal 00h)

注意返回的磁盘结构包括:

10h    QWORD  total number of sectors on drive

补充说明

Int 13h/AH=48h 和其他扩展磁盘功能可能会成为所有仍然支持传统 BIOS 的现代系统的一部分。几十年前,情况可能并非如此。要确定 BIOS 是否真的支持扩展磁盘 BIOS 服务,您可以使用 Int 13/AH=41h/BX=55AAh:

IBM/MS INT 13 Extensions - INSTALLATION CHECK
AH = 41h
BX = 55AAh
DL = drive (80h-FFh)

Return:
CF set on error (extensions not supported)
AH = 01h (invalid function)
CF clear if successful
BX = AA55h if installed
AH = major version of extensions
01h = 1.x
20h = 2.0 / EDD-1.0
21h = 2.1 / EDD-1.1
30h = EDD-3.0
AL = internal use
CX = API subset support bitmap (see #00271)
DH = extension version (v2.0+ ??? -- not present in 1.x)

如果您使用此 BIOS 服务并且在 BX = AA55h 中返回值,则 BIOS 支持磁盘扩展。如果不是,则您必须退回到使用使用 CHS 寻址的非扩展磁盘功能。如果 BIOS 确实支持扩展磁盘服务,这并不意味着您正在检查的磁盘实际上支持它!大多数软盘不支持扩展 BIOS 磁盘服务,即使 BIOS 本身支持。

这就是为什么您还需要检查返回的进位标志 (CF) 以查看您感兴趣的驱动器是否支持磁盘扩展。如果不支持,您将不得不回退到非扩展 BIOS 磁盘服务使用 CHS 寻址,否则您可以随意使用驱动器上的扩展磁盘 BIOS 服务。

一旦您确定驱动器支持扩展 BIOS 磁盘服务,那么您可以使用本答案第一部分中讨论的 Int 13h/AH=48h 来确定扇区大小。