news 2026/4/23 14:52:10

【BIOS中断】磁盘与 INT 13H

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【BIOS中断】磁盘与 INT 13H

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 Extensions(AH=42h)支持大容量磁盘

💡 BIOS 将INT 13h的中断向量(地址)存放在内存0x0000:0x004C处。

(二)磁盘结构

(三)磁盘布局

磁盘的布局(Disk Layout)是指存储设备(如硬盘、SSD、软盘)上数据的物理或逻辑组织方式。不同层级(硬件、BIOS、操作系统)对磁盘布局的理解不同。以下是x86 PC 启动过程中的关键结构

1. 物理/传统布局(CHS 模型)

早期硬盘使用CHS(Cylinder-Head-Sector)模型:

  • 柱面(Cylinder):所有盘片上相同半径的磁道集合
  • 磁头(Head):每个盘面对应一个读写磁头
  • 扇区(Sector):每个磁道被划分为多个扇区(通常512 字节/扇区

⚠️ 现代磁盘已不使用 CHS,但 BIOS 和 MBR 仍模拟此模型以保持兼容。

2. 逻辑布局(LBA 模型)

现代磁盘使用LBA(Logical Block Addressing)

  • 扇区编号从0 开始连续编号
  • LBA 0 = 第一个扇区
  • LBA 1 = 第二个扇区
  • ...
  • 总容量 = (LBA 最大值 + 1) × 512 字节

LBA 是操作系统和现代 BIOS 使用的标准

二、PC 磁盘关键布局(启动相关)

(一)主引导记录(MBR)— LBA 0

偏移大小内容
0x000446 字节引导代码(Bootstrap Code)
0x1BE64 字节分区表(4 项 × 16 字节)
0x1FE2 字节签名(0x55AA)

💡 MBR 总共512 字节,是磁盘的第一个扇区。

分区表项结构(16 字节):
偏移长度含义
01状态(0x80 = 可启动)
13起始 CHS(已废弃)
41分区类型(如 0x0B = FAT32, 0x83 = Linux)
53结束 CHS(已废弃)
84起始 LBA(关键!)
124分区总扇区数

现代系统只使用“起始 LBA”字段,忽略 CHS。


(二)分区布局(以主分区为例)

假设一个硬盘有 1 个主分区:

LBA 地址内容
0MBR
1 ~ N-1空闲(或第二阶段 bootloader)
N分区引导记录(PBR) / Volume Boot Record(VBR)
N+1 ~ ...文件系统数据(如 FAT 表、根目录、簇数据)

💡N = 分区起始 LBA(来自 MBR 分区表)


(三)典型文件系统布局(以 FAT32 为例)

在分区内部(从 PBR 开始):

偏移(相对分区起始)内容
0x000PBR(512 字节)
• BPB(BIOS Parameter Block)
• 引导代码
• 签名(0x55AA)
0x00DBPB:每扇区字节数(通常 512)
0x00EBPB:每簇扇区数
0x01CBPB:FAT 表数量
0x024BPB:根目录起始簇
0x02CBPB:总扇区数(32 位)
0x036BPB:每个 FAT 表占用扇区数
紧随 PBRFAT 表 1
+ FAT 大小FAT 表 2(备份)
+ FAT 大小根目录区
之后数据区(文件内容)

(四)Linux ext2/ext3/ext4 布局

偏移内容
0x000超级块(Superblock)
• 文件系统元信息(块大小、inode 数等)
0x400块组描述符表(GDT)
后续块位图、inode 位图、inode 表、数据块

💡 ext 系列使用块(Block)而非扇区(通常 1K~4K/块)。


(五)启动过程中的磁盘访问流程

  1. BIOSMBR(LBA 0)加载到内存0x7C00
  2. MBR 代码
    • 扫描分区表,找到活动分区(状态=0x80)
    • INT 13h读取该分区的PBR(LBA = 分区起始 LBA)0x7E00
  3. PBR 代码
    • 解析 BPB,定位 FAT 表/根目录
    • 读取第二阶段 bootloader(如 GRUB 的core.img或 DOS 的IO.SYS
  4. 第二阶段
    • 加载内核(如vmlinuzKERNEL.SYS

三、通用寄存器约定

寄存器用途
AH功能号(子功能选择)
CF返回状态CF=0成功,CF=1失败
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第二块硬盘
0xE00xFF可能用于 CD-ROM(需 El Torito)

⚠️重要:当 BIOS 加载 MBR 时,会将启动驱动器号放入DL,你的代码应直接使用它!

四、基础功能

(一)复位磁盘系统(AH = 00h)

mov ah, 0x00 mov dl, 0x80 ; 硬盘0 int 0x13 ; CF=0: 成功;CF=1: 失败(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 ; CF=1 表示错误

🔢CHS 地址说明:

  • 扇区号从 1 开始(不是 0!)
  • CL的位结构:text
CL = [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 = 03h)

mov ah, 0x03 ; 写扇区 mov al, 1 ; 写 1 个扇区 ; ... 其他参数同读 ... mov bx, buffer ; ES:BX = 源数据 int 0x13

⚠️注意:很多 BIOS 禁止在 MBR 中写硬盘(安全限制)!

(四)获取驱动器参数(AH = 08h)

mov ah, 0x08 mov dl, 0x80 ; 查询硬盘0 int 0x13 ; 返回: ; AL = 最后一个有效磁头号(0-based) ; CH = 最大柱面低8位 ; CL = [C9 C8 | max_sector] ; DH = 最大磁头号(同 AL) ; DL = 驱动器数量(bit7=1表示硬盘)
  • 用于动态探测磁盘几何结构

(五)检测驱动器就绪(AH = 15h)

mov ah, 0x15 mov dl, 0x80 int 0x13 ; 返回: ; AH = 状态 ; 00h: 不支持 ; 01h: 无介质 ; 02h: 可移动盘,有介质 ; 03h: 固定盘(硬盘) ; CX:DX = 扇区总数(仅当 AH=03h 时有效)
  • 可用于判断是否为硬盘

五、扩展功能

传统 CHS 无法访问 >8.4GB 磁盘。扩展 INT 13h(由 Enhanced Disk Drive Specification 定义)使用 LBA 寻址

(一)读取扇区(AH = 42h)

1.定义磁盘地址包(Disk Address Packet, DAP)

struct DAP { uint8_t size; // = 0x10 (16 字节) uint8_t reserved; // = 0 uint16_t count; // 要读取的扇区数 uint16_t offset; // 目标缓冲区偏移(ES:offset) uint16_t segment; // 目标缓冲区段地址 uint64_t lba; // 起始 LBA(64 位) };

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 ; 如果 CF=0 且 BX=0xAA55,则支持扩展

优势:支持 64 位 LBA,可访问超大磁盘(理论上 2^64 扇区)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 9:41:06

开题报告“救星”来了!书匠策AI如何用科技解锁科研新姿势

对于许多科研新手来说,撰写开题报告就像一场“闯关游戏”——选题撞车、文献堆砌、逻辑混乱、格式错误……每一步都可能让人崩溃。但别担心,如今有一款名为书匠策AI的智能工具(官网:www.shujiangce.com,微信公众号搜“…

作者头像 李华
网站建设 2026/4/23 9:42:24

springboot留守儿童信息系统 论文

目录研究背景与意义系统架构与技术选型核心功能模块创新点与优势应用场景与展望项目技术支持可定制开发之功能亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作研究背景与意义 随着城市化进程加速,农村留守儿童问题日益突出。…

作者头像 李华
网站建设 2026/4/23 9:40:27

强连通分量+缩点

lc3383强连通分量&#xff1a;图里互相可达的节点&#xff0c;打包成一个整体。 缩点&#xff1a;把每个强连通分量当成一个“超级节点”&#xff0c;原图变成有向无环图#include <vector> using namespace std;class Solution { public:int minRunesToAdd(int n, vector…

作者头像 李华
网站建设 2026/4/23 9:43:00

企业级音频内容管理:从混沌到有序的语音检索系统构建指南

企业级音频内容管理&#xff1a;从混沌到有序的语音检索系统构建指南 【免费下载链接】faster-whisper 项目地址: https://gitcode.com/gh_mirrors/fas/faster-whisper 在数字化转型的浪潮中&#xff0c;企业每天产生的音频数据正以惊人速度增长——客户服务中心的通话…

作者头像 李华
网站建设 2026/4/23 9:37:46

当代码面临道德选择:VR如何为AI伦理决策注入“人性压力”

在自动驾驶系统必须做出“电车难题”式抉择的瞬间&#xff0c;在医疗AI权衡不同患者生存概率的危急时刻&#xff0c;软件测试工程师面临的核心挑战已超越功能验证——如何模拟人类在高压下的道德困境&#xff1f; 虚拟现实技术正以颠覆性方式重构伦理测试范式&#xff1a;通过构…

作者头像 李华