You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BIOS int 0x13扇区读取正常,跳转至二级引导代码0x0800:0x0000失败

引导加载程序读取二级引导失败排查方案

核心问题定位

你计算的CHS参数存在错误:扇区289对应的扇区编号应为1而非2,这导致int 0x13读取的是错误扇区,而非目标的二级引导代码。

关键修正步骤

1. 修正CHS参数计算

BIOS int 0x13的CHS模式中,扇区编号从1开始,正确的扇区289计算逻辑:

  • 总扇区数(从1起)= 289
  • 柱面C = (289-1) // (磁头数×每磁道扇区数) = 288 // (16×32) = 0
  • 剩余扇区 = 289-1 - 0×(16×32) = 288
  • 磁头H = 288 // 32 = 9
  • 扇区S = (288 % 32) + 1 = 0 + 1 = 1

最终正确CHS参数:柱面0、磁头9、扇区1。

2. 修正int 0x13调用代码

; 读取二级引导的代码片段修正
mov ax, 0x0800
mov es, ax
xor bx, bx          ; 加载地址ES:BX = 0x0800:0x0000
mov ah, 0x02        ; BIOS读扇区功能号
mov al, 0x01        ; 读取1个扇区
mov ch, 0x00        ; 柱面号低8位(柱面0)
mov cl, 0x01        ; 扇区号(低5位)+ 柱面号高2位(这里为0)
mov dh, 0x09        ; 磁头号
mov dl, [boot_drive]; 启动盘号(第一阶段引导时保存的DL值)
int 0x13
jc disk_error       ; 若CF置位则处理错误

3. 读取后验证内存内容

读取完成后,添加代码验证ES:[BX]处的字节是否与磁盘镜像中偏移0x24200的内容一致,比如用int 0x10输出前几个字节的十六进制值:

; 示例:输出ES:BX处第一个字节的十六进制
mov al, [es:bx]
call print_hex      ; 需自行实现十六进制打印函数

4. 确保栈环境正常

跳转前需设置合法的栈指针,避免栈溢出破坏二级引导代码:

mov ax, 0x0000
mov ss, ax
mov sp, 0xFFFF      ; 栈顶设为0xFFFF,预留足够空间

其他确认点

  • 二级引导编译时需确保用16位二进制格式(如nasm -f bin boot2.asm -o boot2.bin),且写入磁盘镜像时准确对应扇区289。
  • 二级引导的[org 0x0000]与加载地址0x0800:0x0000匹配,物理地址为0x0800*16+0=0x8000,无需调整。

内容的提问来源于stack exchange,提问作者55kkkk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:25:03