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
相关产品推荐
相关产品推荐

