INT 13h
是 BIOS 中断调用 13H 的简写,是基于 x86 架构(源自 IBM PC)的计算机系统中的第 20 个中断向量。BIOS 通常在此向量处设置一个实模式中断处理程序,该程序提供基于扇区的硬盘和软盘读写服务。
最初的 BIOS 实模式 INT 13h
接口使用通常所说的物理柱面 - 磁头 - 扇区(CHS)寻址方式,支持最大约 8GB 大小的驱动器。这个限制源于 IBM PC/XT 磁盘硬件的硬件接口。
为了支持对更大磁盘的寻址,IBM 和微软引入了一个名为 INT 13h
扩展的接口,后来 Phoenix Technologies 将其重新发布并稍作扩展,作为 BIOS 增强磁盘驱动器服务(BIOS Enhanced Disk Drive Services,EDD)的一部分。它在 INT 13h
服务中定义了新的功能,所有功能号都大于 40h,这些功能使用 64 位逻辑块寻址(LBA),允许寻址高达 8 ZiB 的空间。(假设扇区 / 块大小为 512 字节,一个 ATA 驱动器也可以支持 28 位或 48 位 LBA,分别允许高达 128 GiB 或 128 PiB 的空间)。
驱动器表
通常第 1 个软盘或第 1 个硬盘被用作系统的启动盘,由 BIOS 设置到 dl
寄存器中,并被 bootloader 使用。
DL = 00h | 第 1 个软盘/软驱 ( “drive A:” ) |
---|---|
DL = 01h | 第 2 个软盘/软驱 ( “drive B:” ) |
DL = 02h | 第 3 个软盘/软驱 ( “drive C:” ) |
. . . | |
DL = 7Fh | 第 128 个软盘/软驱 |
DL = 80h | 第 1 个硬盘 |
DL = 81h | 第 2 个硬盘 |
DL = 82h | 第 3 个硬盘 |
. . . | |
DL = E0h | CD/DVD 或 第 97 个硬盘 |
. . . | |
DL = FFh | 第 128 个硬盘 |
功能表
AH = 00h | 软盘/硬盘 | Reset Disk System |
---|---|---|
AH = 01h | 软盘/硬盘 | Get Status of Last Drive Operation |
AH = 02h | 软盘/硬盘 | Read Sectors From Drive |
AH = 03h | 软盘/硬盘 | Write Sectors To Drive |
AH = 04h | 软盘/硬盘 | Verify Sectors |
. . . | ||
AH = 41h | EXT | Test Whether Extensions Are Available |
AH = 42h | EXT | Read Sectors From Drive |
AH = 43h | EXT | Write Sectors To Drive |
AH = 44h | EXT | Verify Sectors |
. . . |
EXT:
INT 13h
扩展功能,用于支持超过 8GB 的硬盘驱动器。
INT 13h AH=00h
磁盘系统复位
输入参数:
DL
:指示驱动器号,如0x80
代表第 1 块硬盘,0x00
代表第 1 块软盘。AH=00H
返回结果:
CF
:进位标志。清除(0)表示正确,设置(1)表示错误(需检查AH
中的错误码);AH
:返回码;
INT 13h AH=01h
获取最后一个驱动器操作的状态。
输入参数:
DL
:指示驱动器号,如0x80
代表第 1 块硬盘,0x00
代表第 1 块软盘。AH=01H
返回结果:
CF
:进位标志。清除(0)表示正确,设置(1)表示错误(需检查AH
中的错误码);AH
:返回码:00H
:成功01H
:非法命令02H
:地址目标未发现03H
:磁盘写保护(软盘)04H
:扇区未发现05H
:复位失败(硬盘)06H
:软盘被取出(软盘)07H
:错误的参数表(硬盘)08H
:DMA 越界(软盘)09H
:DMA 超过 64K 界限0AH
:错误的扇区标志(硬盘)0BH
:错误的磁道标志(硬盘)0CH
:介质类型未发现(软盘)0DH
: 格式化时非法扇区号(硬盘)0EH
:控制数据地址目标被发现(硬盘)0FH
:DMA 仲裁越界(硬盘)10H
:不正确的 CRC 或 ECC 编码11H
:ECC 校正数据错(硬盘)20H
:控制器失败40H
:查找失败80H
:磁盘超时(未响应)AAH
:驱动器未准备好(硬盘)BBH
:未定义的错误(硬盘)CCH
:写错误(硬盘)E0H
:状态寄存器错(硬盘)FFH
:检测操作失败(硬盘)
INT 13h AH=02h
用于从软盘/硬盘中读取扇区。
输入参数:
DL
:指示驱动器号,如0x80
代表第 1 块硬盘,0x00
代表第 1 块软盘。AH = 02H
:使用02H
号功能。AL
:需要读取的扇区数。CH
:柱面号的低 8 位。CL
:低 6 位(位 0-5)是扇区号(1-63);高 2 位(位 6-7)代表柱面号的高 2 位(共 10 位柱面号)。DH
:磁头号ES:BX
:指示缓冲区的地址,存放从扇区读取的内容。
返回结果:
CF
:进位标志。清除(0)表示正确,设置(1)表示错误(需检查AH
中的错误码);AH
:返回码;AL
:实际读取的扇区数。
INT 13h AH=03h
写扇区。
输入参数:
DL
:指示驱动器号,如AH = 00h
表示使用第一个软盘。AH = 03H
:03H
号功能。AL
:需要写入的扇区数。CH
:柱面号的低 8 位。CL
:低 6 位(位 0-5)是扇区号(1-63);高 2 位(位 6-7)代表柱面号的高 2 位(共 10 位柱面号)。DH
:磁头号ES:BX
:缓冲区的地址,存放写入扇区的内容。
返回结果:
CF
:进位标志。清除(0)表示正确,设置(1)表示错误(需检查 AH 中的错误码);AH
:返回码;AL
:实际写入的扇区数。
INT 13h AH=04h
校验扇区。
输入参数:
DL
:驱动器号,如0x80
代表第 1 块硬盘,0x00
代表第 1 块软盘。AH = 04H
:04H
号功能。AL
:要验证的扇区数(1 到 127,具体取决于 BIOS 支持)CH
:柱面号的低 8 位。CL
:低 6 位(位 0-5)是扇区号(1-63);高 2 位(位 6-7)代表柱面号的高 2 位(共 10 位柱面号)。DH
:磁头号ES:BX
:缓冲区地址(此功能通常忽略该参数,但某些 BIOS 可能要求有效地址)。
返回结果:
CF
:进位标志。清除(0)表示正确,设置(1)表示错误(需检查 AH 中的错误码);AH
:返回码;AL
:实际验证的扇区数。
INT 13h AH=08h
读取驱动器参数。用于获取磁盘的 CHS(柱面-磁头-扇区)逻辑参数,适用于软盘和硬盘。
输入参数:
AH=0x08
:功能号。DL
驱动器号,如0x80
代表第 1 块硬盘,0x00
代表第 1 块软盘。ES:DI
:建议设为0000h:0000h
以避免某些 BIOS 错误。
返回结果:
CF
:进位标志。清除(0)表示正确,设置(1)表示错误(需检查 AH 中的错误码);AH
:返回码;DL
:系统中连接的硬盘数量(如 0x01=1 块硬盘);DH
:逻辑磁头数 - 1(磁头索引从 0 开始);CX
:柱面与扇区参数:- 高 10 位:柱面数 - 1(索引从 0 开始)。
- 低 6 位:每磁道扇区数(索引从 1 开始)。
BL
:驱动器类型(仅 AT/PS2 软盘有效);ES:DI
:软盘参数表地址(仅软盘有效,硬盘返回0000h:0000h
)。
功能号 08h
的逻辑值可能/应该不同于功能号 48h
的物理 CHS 值。
结果寄存器 CX
包含柱面和扇区/磁道值,见功能号 02h
注释。
INT 13h AH=41h
此 BIOS 中断用于检测磁盘驱动器(如硬盘或现代存储设备)是否支持扩展功能(如 LBA 模式、EDD 等)。
输入参数:
AH = 0x41
:功能号,检查扩展功能是否支持;DL
:驱动器号。如 0x80 代表第 1 块硬盘,0x00 代表第 1 块软盘;BX = 0x55AA
:魔数(固定值,用于验证)。
返回结果:
CF
:进位标志。清除(0)表示支持扩展功能;设置(1)表示不支持;AH
:主版本号或错误码;BX = AA55h
:固定返回值,用于验证 BIOS 是否响应此功能;CX
:接口支持的位掩码:- 位 0:支持磁盘数据包结构(Disk Address Packet, DAP),即
LBA
模式访问; - 位 1:支持驱动器锁定和弹出(如可移动磁盘);
- 位 2:支持增强型磁盘驱动器(Enhanced Disk Drive Support,EDD) 功能(如大容量磁盘访问)。支持的功能可能同时存在,例如 CX=0x0005 表示同时支持 DAP 和 EDD。
- 位 0:支持磁盘数据包结构(Disk Address Packet, DAP),即
INT 13h AH=42h
从驱动器中扩展读扇区。
输入参数:
AH = 0x42
:功能号,拓展读;DL
:驱动器号,如0x80
代表第 1 块硬盘,0x00
代表第 1 块软盘;DS:SI
:段:偏移
,DAP
的地址。
DAP(Disk Address Packet)是用于扩展磁盘访问(LBA 模式) 的数据结构,通过 BIOS 中断INT 13h AH=42h
读取或写入磁盘。
DAP 结构布局偏移量(字节) 大小(字节) 字段描述 00h 1 DAP 大小(固定为 0x10
,即 16 字节)。01h 1 保留字段,必须置零。 02h-03h 2 要传输的扇区数(某些 BIOS 限制最大为 127)。 04h-07h 4 内存缓冲区的 段:偏移 地址(小端序,偏移在前,段在后)。 08h-0Fh 8 起始扇区的 64 位 LBA 地址(小端序,低 32 位在前,高 32 位在后)。
返回结果:
CF
:进位标志。清除(0)表示正确;设置(1)表示错误(需检查AH
中的错误码);AH
:返回码。
如前面 int 13h AH=02h
所述,必须注意确保完整的缓冲区在给定的段内,即 (BX + size_of_buffer) <= 10000h
INT 13h AH=43h
向驱动器中扩展写扇区。
输入参数:
AH = 0x43
:功能号,扩展写。AL
:位掩码控制:- 位 0:
0
关闭写校验;1
开启写校验(写入后验证数据正确性)。 - 位 1-7:保留位,必须设为 0。
- 位 0:
DL
:驱动器号。如0x80
代表第 1 块硬盘,0x00
代表第 1 块软盘。DS:SI
:段:偏移
,DAP
(Disk Address Packet)地址(与读操作相同)。
返回结果:
CF
:进位标志。清除(0)表示正确;设置(1)表示错误(需检查 AH 中的错误码);AH
:返回码。
INT 13h AH=48h
扩展读驱动器参数
输入参数:
AH = 0x48
:功能号,扩展读驱动器参数。DL
:驱动器号。如0x80
代表第 1 块硬盘,0x00
代表第 1 块软盘。DS:SI
:段:偏移
,RB(Result Buffer)地址。
Result Buffer 字段布局
偏移量(字节) | 大小(字节) | 字段名称 | 描述 |
---|---|---|---|
00h-01h | 2 | Result Buffer Size | 缓冲区大小(固定为 0x1E ,即30字节)。 |
02h-03h | 2 | Information Flags | 信息标志位(表示支持的扩展功能)。 |
04h-07h | 4 | Physical Cylinders | 物理柱面数 = 最大柱面索引 + 1(索引从0开始)。 |
08h-0Bh | 4 | Physical Heads | 物理磁头数 = 最大磁头索引 + 1(索引从0开始)。 |
0Ch-0Fh | 4 | Sectors per Track | 每磁道扇区数 = 最大扇区索引(索引从1开始,因此无需加1)。 |
10h-17h | 8 | Total LBA Sectors | 磁盘的绝对扇区总数 = 最大LBA号 + 1(索引从0开始)。 |
18h-19h | 2 | Bytes per Sector | 每扇区字节数(通常为 512)。 |
1Ah-1Dh | 4 | EDD Configuration Pointer | 指向 EDD 配置参数表的指针(用于扩展功能调用,若无则为0)。 |
返回结果:
CF
:进位标志。清除(0)表示正确;设置(1)表示错误(需检查AH
中的错误码);AH
:返回码。