INT 13h有效扇区大小

时间:2020-06-19 23:27:10

标签: x86 boot bootloader bios hard-drive

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

我发现的大多数参考代码都假定一个扇区的大小仅为512字节,尽管事实上存在其他大小(非标准大小,例如520字节的扇区和4096字节的扇区)。我发现有些资料似乎暗示BIOS不论底层大小(LBA and sector size)都将扇区始终模拟为512字节,有些资料似乎表明情况并非如此(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的情况下确定该值?

2 个答案:

答案 0 :(得分:1)

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

除此之外,我不保证每个平台都支持int 13h,48h。

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

非标准大小,例如520字节的扇区

我现在已经为计算机编程了40多年,但是我从未见过使用520字节扇区的单个设备。尽管有复古计算机,您可以选择对软盘做任何事情,但PC软盘控制器仅允许将2的幂作为扇区大小,例如256、512、1024、2048、4096等。并且您不能更改完全在硬盘上。

所以我真的很好奇您发现哪个设备具有520字节的扇区?

答案 1 :(得分:1)

所有未扩展的BIOS disk services(例如Int 13h/AH=2hInt 13h=AH=3h等)均假定为512字节扇区。如果基础媒体恰好使用更大的磁盘扇区大小,则表示已完成转换。

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

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

诸如Int 13h/AH=42hInt 13h/AH=43h之类的扩展BIOS磁盘服务不做任何这样的假设,即扇区大小固定为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),以查看感兴趣的驱动器上是否支持磁盘扩展名。如果不支持这些扩展名,则必须退回到非扩展名。使用CHS寻址的扩展BIOS磁盘服务,否则您可以自由使用驱动器上的扩展磁盘BIOS服务。

确定驱动器支持扩展的BIOS磁盘服务后,您可以使用Int 13h / AH = 48h(如该答案的第一部分所述)来确定扇区大小。

相关问题