X86 INT 13h有效扇区大小

X86 INT 13h有效扇区大小,x86,boot,bootloader,bios,hard-drive,X86,Boot,Bootloader,Bios,Hard Drive,我正在写我自己的引导程序。我希望利用int13h、02h从引导驱动器读取扇区。我正在参考有关此bios中断的文档 我发现的大多数参考代码都假定扇区的大小仅为512字节,尽管存在其他大小(非标准大小,如520字节扇区和4096字节扇区)。我发现的一些来源似乎表明BIOS总是将扇区模拟为512字节,而不管底层大小如何(),还有一些似乎表明情况并非如此(),尽管我发现的任何来源都没有提供支持这一事实的确凿文档 我知道我可以使用int13h、48h读取有关驱动器参数的信息,但是我仍然不确定此中断返回的“

我正在写我自己的引导程序。我希望利用
int13h、02h
从引导驱动器读取扇区。我正在参考有关此bios中断的文档

我发现的大多数参考代码都假定扇区的大小仅为512字节,尽管存在其他大小(非标准大小,如520字节扇区和4096字节扇区)。我发现的一些来源似乎表明BIOS总是将扇区模拟为512字节,而不管底层大小如何(),还有一些似乎表明情况并非如此(),尽管我发现的任何来源都没有提供支持这一事实的确凿文档

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

如果可能,我正在寻找以下信息:

  • 哪个扇区大小实际用于非标准扇区大小的驱动器,以及支持此答案的具体文档
  • 如果实际使用的是非标准尺寸,是否有方法在不依赖int
    13h、48h
    的情况下确定该值

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

    除此之外,int 13h、48h并不能保证在每个平台上都得到支持(我相信)

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

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

    我现在已经为计算机编程40多年了,但我从未见过一台设备使用520字节扇区。虽然有复古电脑,您可以选择对您的软盘执行任何操作,但PC软盘控制器只允许两个扇区大小的功率,如256、512、1024、2048、4096等,并且您根本无法在硬盘上更改这一点

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

    所有非扩展类等都假设为512字节扇区。如果基础介质恰好使用更大的磁盘扇区大小,则需要进行转换

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

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

    扩展BIOS磁盘服务喜欢并且不假设扇区大小固定为512字节。在支持扩展磁盘BIOS服务的任何类型的驱动器上,您都可以查询驱动器参数以确定磁盘扇区大小

    如果发现驱动器支持扩展BIOS磁盘服务,则可以在引导加载程序运行时确定扇区大小。请参阅有关如何检查BIOS和驱动器是否支持这些扩展的附加说明。如果BIOS和驱动器不支持它们,则可以使用来查询磁盘扇区大小:

    [剪报]

    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)
    
    请注意,返回的磁盘结构包括:


    附加说明 Int 13h/AH=48h和其他扩展磁盘功能可能是所有仍支持传统BIOS的现代系统的一部分。几十年前,情况可能并非如此。要确定BIOS是否实际支持扩展磁盘BIOS服务,您可以使用:

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

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


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

    制造商将许多SAS SSD驱动器设置为520字节扇区大小(或520的倍数)。如果您知道自己在做什么,可以在较低的级别对它们进行擦除和重新格式化,以使用512字节的倍数的扇区大小,以便与大多数操作系统和可能访问它们的软件兼容。您是否介意对“现有引导加载程序(例如Linu)”的含义进行一点扩展
    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
    
    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)