编写简易操作系统时无法进入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
相关产品推荐
相关产品推荐

