我正在编写自己的引导程序。我希望利用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字节)”。
如果可能,我正在寻找以下内容:
13h,48h
的情况下确定该值?答案 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=2h,Int 13h=AH=3h等)均假定为512字节扇区。如果基础媒体恰好使用更大的磁盘扇区大小,则表示已完成转换。
扇区大小将是512字节的倍数,以与旧版BIOS兼容。在IBM-PC的早期,有一些驱动器支持深奥的扇区大小,但是它们需要使用BIOS提供的不同服务来利用或要求直接访问驱动器(通过IO端口等)。实际上,您需要特殊的硬件才能使用此类设备,或者需要编写专门为这些设备编写的代码。
某些类型的SCSI设备(包括SAS SSD)在最低级别使用520个字节的扇区,但是通常需要擦除驱动器并将其重新格式化以使用某些标准扇区大小,该大小是512字节的倍数,以大多数软件和操作系统都可以理解。这通常涉及直接向驱动器发出SCSI命令。在Linux中,sg_format
可用于执行这种低级操作。这些驱动器通常也需要专门的控制器。
诸如Int 13h/AH=42h和Int 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(如该答案的第一部分所述)来确定扇区大小。