新手自制操作系统:Boot与Kernel连接后QEMU启动失败求助
解决引导失败问题的步骤
问题根源
- 引导扇区(boot.asm)仅打印信息后进入死循环,完全未实现内核加载逻辑,内核根本不会被执行。
- 内核文件(kernel.asm)错误添加了引导扇区的填充代码与签名,导致内核变成无效的引导扇区格式,且未指定内存加载地址,即便被加载也无法正常运行。
- 单纯拼接二进制文件无意义,没有引导扇区的磁盘读取逻辑,内核永远不会被加载到内存。
修复操作
1. 修正内核代码
删除内核中的引导扇区填充和签名,添加内存加载地址声明:
ORG 0x7E00 ; 内核将被加载到引导扇区之后的内存位置(0x7C00+512=0x7E00) BITS 16 start: mov si, msg_kernel call Print jmp $ %include "lib/print.asm" msg_kernel: db "Test Kernel" , 0
2. 给引导扇区添加内核加载逻辑
修改boot.asm,通过BIOS中断读取磁盘上的内核扇区到内存,再跳转执行:
ORG 0x7C00 BITS 16 start: mov si, msg_boot call Print ; 调用BIOS中断0x13读取内核扇区 mov ah, 0x02 ; 读磁盘功能号 mov al, 0x01 ; 读取1个扇区(当前内核大小小于512字节,足够) mov ch, 0x00 ; 柱面0 mov cl, 0x02 ; 第2个扇区(引导扇区为第1个) mov dh, 0x00 ; 磁头0 mov dl, 0x00 ; 虚拟软盘驱动器 mov bx, 0x7E00 ; 内核加载到内存0x7E00处 int 0x13 ; 触发BIOS中断 ; 跳转到内核执行 jmp 0x7E00 %include "lib/print.asm" msg_boot: db "Test Boot" , 0 times 510 - ($- $$) db 0 dw 0xAA55
3. 重新编译合并文件
使用copy /b替代type,避免Windows系统添加多余文本字符:
nasm -f bin -o boot.bin boot.asm nasm -f bin -o kernel.bin kernel.asm copy /b boot.bin + kernel.bin os.bin qemu-system-x86_64 -fda os.bin ; 明确指定磁盘为软盘镜像,避免识别错误
额外排查点
如果仍启动失败,检查lib/print.asm中的打印函数是否正确,比如调用BIOS中断0x10时是否正确保存寄存器,避免破坏加载内核时用到的寄存器值。
内容的提问来源于stack exchange,提问作者Federico Occhiochiuso
相关产品推荐
相关产品推荐

