gpt4 book ai didi

x86 - INT 13h 有效扇区大小

转载 作者:行者123 更新时间:2023-12-04 12:58:37 26 4
gpt4 key购买 nike

我正在编写自己的 bootstrap 。我正在寻求杠杆作用 int 13h,02h从引导驱动器读取扇区。我指的是 https://en.wikipedia.org/wiki/INT_13H有关此 bios 中断的文档。
尽管存在其他大小(非标准大小,例如 520 字节扇区和 4096 字节扇区),但我发现的大多数引用代码都假定扇区的大小仅为 512 字节。我发现的一些来源似乎表明,无论底层大小( LBA and sector size )如何,BIOS 都将始终将扇区模拟为 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 字节)”。
如果可能,我正在寻找以下内容:

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

    所有非扩展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 可以用来做这种低级操作。这些类型的驱动器通常也需要专门的 Controller 。
    扩展 BIOS 磁盘服务,如 Int 13h/AH=42hInt 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 来确定扇区大小,如本答案第一部分所述。

    关于x86 - INT 13h 有效扇区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62483420/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com