INT 13h是 x86 PC 架构中BIOS 提供的磁盘服务中断用于在实模式下对软盘、硬盘等存储设备进行底层读写操作。它是操作系统引导程序如 MBR、bootloader访问磁盘的唯一标准接口。一、基本概念一int 13H中断号0x13十进制 19调用方式int 0x13运行环境实模式Real Mode支持设备软盘Floppy、硬盘HDD、早期 USB 存储需 BIOS 支持寻址方式传统 CHS柱面-磁头-扇区最大 8.4 GB扩展 LBA逻辑块地址通过INT 13h ExtensionsAH42h支持大容量磁盘 BIOS 将INT 13h的中断向量地址存放在内存0x0000:0x004C处。二磁盘结构三磁盘布局磁盘的布局Disk Layout是指存储设备如硬盘、SSD、软盘上数据的物理或逻辑组织方式。不同层级硬件、BIOS、操作系统对磁盘布局的理解不同。以下是x86 PC 启动过程中的关键结构。1. 物理/传统布局CHS 模型早期硬盘使用CHSCylinder-Head-Sector模型柱面Cylinder所有盘片上相同半径的磁道集合磁头Head每个盘面对应一个读写磁头扇区Sector每个磁道被划分为多个扇区通常512 字节/扇区⚠️ 现代磁盘已不使用 CHS但 BIOS 和 MBR 仍模拟此模型以保持兼容。2. 逻辑布局LBA 模型现代磁盘使用LBALogical Block Addressing扇区编号从0 开始连续编号LBA 0 第一个扇区LBA 1 第二个扇区...总容量 (LBA 最大值 1) × 512 字节✅LBA 是操作系统和现代 BIOS 使用的标准。二、PC 磁盘关键布局启动相关一主引导记录MBR— LBA 0偏移大小内容0x000446 字节引导代码Bootstrap Code0x1BE64 字节分区表4 项 × 16 字节0x1FE2 字节签名0x55AA MBR 总共512 字节是磁盘的第一个扇区。分区表项结构16 字节偏移长度含义01状态0x80 可启动13起始 CHS已废弃41分区类型如 0x0B FAT32, 0x83 Linux53结束 CHS已废弃84起始 LBA关键124分区总扇区数✅现代系统只使用“起始 LBA”字段忽略 CHS。二分区布局以主分区为例假设一个硬盘有 1 个主分区LBA 地址内容0MBR1 N-1空闲或第二阶段 bootloaderN分区引导记录PBR / Volume Boot RecordVBRN1 ...文件系统数据如 FAT 表、根目录、簇数据N 分区起始 LBA来自 MBR 分区表三典型文件系统布局以 FAT32 为例在分区内部从 PBR 开始偏移相对分区起始内容0x000PBR512 字节• BPBBIOS Parameter Block• 引导代码• 签名0x55AA0x00DBPB每扇区字节数通常 5120x00EBPB每簇扇区数0x01CBPBFAT 表数量0x024BPB根目录起始簇0x02CBPB总扇区数32 位0x036BPB每个 FAT 表占用扇区数紧随 PBRFAT 表 1 FAT 大小FAT 表 2备份 FAT 大小根目录区之后数据区文件内容四Linux ext2/ext3/ext4 布局偏移内容0x000超级块Superblock• 文件系统元信息块大小、inode 数等0x400块组描述符表GDT后续块位图、inode 位图、inode 表、数据块 ext 系列使用块Block而非扇区通常 1K4K/块。五启动过程中的磁盘访问流程BIOS将MBRLBA 0加载到内存0x7C00MBR 代码扫描分区表找到活动分区状态0x80用INT 13h读取该分区的PBRLBA 分区起始 LBA到0x7E00PBR 代码解析 BPB定位 FAT 表/根目录读取第二阶段 bootloader如 GRUB 的core.img或 DOS 的IO.SYS第二阶段加载内核如vmlinuz、KERNEL.SYS三、通用寄存器约定寄存器用途AH功能号子功能选择CF返回状态CF0成功CF1失败AL/AX输入/输出参数依功能而定DL驱动器号关键AH功能编码00H —磁盘系统复位01H —读取磁盘系统状态02H —读扇区03H —写扇区04H —检验扇区05H —格式化磁道06H —格式化坏磁道07H —格式化驱动器08H —读取驱动器参数09H —初始化硬盘参数0AH —读长扇区0BH —写长扇区0CH —查寻0DH —硬盘系统复位0EH —读扇区缓冲区0FH —写扇区缓冲区10H —读取驱动器状态11H —校准驱动器12H —控制器RAM诊断13H —控制器驱动诊断14H —控制器内部诊断15H —读取磁盘类型16H —读取磁盘变化状态17H —设置磁盘类型18H —设置格式化媒体类型19H —磁头保护1AH —格式化ESDI驱动器驱动器号DL编码值设备0x00软驱 A:0x01软驱 B:0x80第一块硬盘主盘0x81第二块硬盘0xE0–0xFF可能用于 CD-ROM需 El Torito⚠️重要当 BIOS 加载 MBR 时会将启动驱动器号放入DL你的代码应直接使用它四、基础功能一复位磁盘系统AH 00hmov ah, 0x00 mov dl, 0x80 ; 硬盘0 int 0x13 ; CF0: 成功CF1: 失败AH错误码重置控制器清除错误状态建议在读写前调用提高兼容性二读取扇区AH 02h✅ 最常用mov ah, 0x02 ; 读扇区 mov al, 1 ; 读 1 个扇区 mov ch, 0 ; 柱面低8位 mov cl, 2 ; 扇区号1-63位7-6为柱面高2位 mov dh, 0 ; 磁头号 mov dl, 0x80 ; 驱动器硬盘0 mov bx, 0x7E00 ; ES:BX 目标缓冲区 int 0x13 jc error ; CF1 表示错误CHS 地址说明扇区号从 1 开始不是 0CL的位结构textCL [C9 C8 | S5 S4 S3 S2 S1 S0] 柱面高2位 扇区号1-63 LBA → CHS 转换假设 255 磁头/63 扇区sector (LBA % 63) 1; head (LBA / 63) % 255; cyl (LBA / 63) / 255; // CL (cyl 2) | sector; // CH cyl 0xFF;三写入扇区AH 03hmov ah, 0x03 ; 写扇区 mov al, 1 ; 写 1 个扇区 ; ... 其他参数同读 ... mov bx, buffer ; ES:BX 源数据 int 0x13⚠️注意很多 BIOS 禁止在 MBR 中写硬盘安全限制四获取驱动器参数AH 08hmov ah, 0x08 mov dl, 0x80 ; 查询硬盘0 int 0x13 ; 返回 ; AL 最后一个有效磁头号0-based ; CH 最大柱面低8位 ; CL [C9 C8 | max_sector] ; DH 最大磁头号同 AL ; DL 驱动器数量bit71表示硬盘用于动态探测磁盘几何结构五检测驱动器就绪AH 15hmov ah, 0x15 mov dl, 0x80 int 0x13 ; 返回 ; AH 状态 ; 00h: 不支持 ; 01h: 无介质 ; 02h: 可移动盘有介质 ; 03h: 固定盘硬盘 ; CX:DX 扇区总数仅当 AH03h 时有效可用于判断是否为硬盘五、扩展功能传统 CHS 无法访问 8.4GB 磁盘。扩展 INT 13h由 Enhanced Disk Drive Specification 定义使用 LBA 寻址。一读取扇区AH 42h1.定义磁盘地址包Disk Address Packet, DAPstruct DAP { uint8_t size; // 0x10 (16 字节) uint8_t reserved; // 0 uint16_t count; // 要读取的扇区数 uint16_t offset; // 目标缓冲区偏移ES:offset uint16_t segment; // 目标缓冲区段地址 uint64_t lba; // 起始 LBA64 位 };2. 使用示例; 定义 DAP在数据段 dap: db 0x10 ; size db 0 ; reserved dw 1 ; 读 1 个扇区 dw 0x7E00 ; offset dw 0x0000 ; segment dq 1 ; LBA 1 ; 调用扩展读 mov ah, 0x42 mov dl, 0x80 ; 驱动器 mov si, dap ; DS:SI - DAP int 0x13 jc error二检测扩展支持mov ah, 0x41 mov bx, 0x55AA ; magic mov dl, 0x80 int 0x13 ; 如果 CF0 且 BX0xAA55则支持扩展✅优势支持 64 位 LBA可访问超大磁盘理论上 2^64 扇区