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

新手自制操作系统:Boot与Kernel连接后QEMU启动失败求助

解决引导失败问题的步骤

问题根源

  1. 引导扇区(boot.asm)仅打印信息后进入死循环,完全未实现内核加载逻辑,内核根本不会被执行。
  2. 内核文件(kernel.asm)错误添加了引导扇区的填充代码与签名,导致内核变成无效的引导扇区格式,且未指定内存加载地址,即便被加载也无法正常运行。
  3. 单纯拼接二进制文件无意义,没有引导扇区的磁盘读取逻辑,内核永远不会被加载到内存。

修复操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:25:33