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

编写简易操作系统时无法进入protected mode问题求助

问题原因&修复方案

1. 引导加载地址配置错误

BIOS默认将MBR引导扇区加载到物理内存0x7C00位置,但你代码开头的[org 0xc700]会让NASM计算所有符号地址时基于0xc700偏移,导致lgdt [GDT_desriptor]指令读取的GDT地址完全错误,CPU加载无效GDT后触发三重故障自动重启,就是你看到的反复闪烁启动提示的现象。
修复:将boot.asm第一行改为[org 0x7c00]

2. 保护模式初始化未设置段寄存器

切换到32位保护模式后,实模式下的段寄存器缓存内容全部失效,必须手动将所有数据相关段寄存器设置为GDT中定义的DATA_SEG值,否则后续访问内存(包括写显存)会触发段异常。
修复:修改enter_pm.asm的init_pm部分,补充段寄存器初始化逻辑:

[bits 32]
init_pm:
    ; 初始化所有数据段寄存器
    mov ax, DATA_SEG
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov fs, ax
    mov gs, ax
    ; 重设32位栈指针,避免栈地址冲突
    mov esp, 0x90000

    mov al, 'A'
    mov ah, 0x0f
    mov [0xb8000], ax
    ; 加个死循环避免代码跑飞
    jmp $

3. 运行命令优化

qemu直接传入bin文件时可能出现介质类型识别错误,建议明确指定为软盘镜像启动:
qemu-system-x86_64 -fda boot.bin

修改完成后重新编译运行,就可以在屏幕左上角看到白色的'A'字符,说明已经成功进入保护模式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:18:02