使用Bochs调试VirtualBox中BootLoader遇磁盘扇区读取错误求助
BootLoader 调试时 Bochs 磁盘读取错误修复方案
你执行int 0x13磁盘读取中断时触发的错误,核心原因是软盘镜像不满足读取要求,或是Bochs配置、代码逻辑存在疏漏,以下是具体分析和解决步骤:
你的BootLoader代码
mov ax,0x0820 mov es,ax mov ch,0 mov dh,0 mov cl,2 mov ah,0x02 mov al,1 mov bx,0 mov dl,0x00 int 0x13 times (510-($-$$)) db 0 db 0x55,0xaa
触发的错误信息
00017307933i[FLOPPY] attempt to read/write sector 2 with media not present
00025271896i[FLOPPY] controller reset in software
00025288589e[CPU0 ] read_virtual_checks(): read beyond limit
错误原因
- 软盘镜像容量不足:代码尝试读取第2扇区,但如果你的镜像只写入了BootLoader(仅1个扇区),Bochs会判定该扇区不存在,触发介质缺失错误。
- Bochs配置未正确关联镜像:若配置文件中未指定完整路径的软盘镜像,或镜像格式不匹配,会导致模拟器无法识别软盘介质。
- 未处理磁盘读取失败:
int 0x13执行失败时会设置CF标志位,代码未做检查,会继续执行非法内存访问,触发read beyond limit错误。
修复步骤
生成标准软盘镜像
用dd命令创建1.44MB标准软盘镜像(包含2880个扇区,足够容纳后续数据):dd if=/dev/zero of=boot.img bs=512 count=2880将编译好的BootLoader写入镜像第1扇区:
dd if=boot.bin of=boot.img bs=512 count=1 conv=notrunc修正Bochs配置
确保bochsrc配置文件中正确指定软盘镜像和启动方式:floppya: 1_44=boot.img, status=inserted boot: floppy注意镜像路径要和Bochs运行目录一致,或使用绝对路径。
添加磁盘读取错误检查
在int 0x13调用后增加错误处理逻辑,避免非法执行:mov ax,0x0820 mov es,ax mov ch,0 mov dh,0 mov cl,2 mov ah,0x02 mov al,1 mov bx,0 mov dl,0x00 int 0x13 jc disk_error ; CF置位则跳转到错误处理 ; 正常执行逻辑,这里可以添加后续代码 jmp $ ; 无限循环
disk_error:
; 可选:添加错误提示,比如通过BIOS中断输出字符串
jmp $ ; 停在错误处方便调试
times (510-($-$$)) db 0
db 0x55,0xaa
- **确认编译流程正确** 用nasm编译代码: ```bash nasm boot.asm -o boot.bin
确保编译无报错后再写入镜像,避免镜像损坏。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

