32位保护模式OS切换VGA 13h模式黑屏,控制台正常求助
32位OS保护模式下VGA Mode 13h显存写入无显示故障排查
问题场景
正在开发一款32位操作系统,系统已成功启动并切换到保护模式,VGA文本模式0x03的控制台运行正常,可执行help、clear、snake等命令。但执行gui命令切换到VGA Mode 13h(320x200x256)时,屏幕完全黑屏无响应,直接写入显存0xA0000的测试代码也无效;不过按ESC键(通过读取端口0x60处理)可正常退出GUI返回控制台,说明GUI代码在运行但显存写入无显示效果。
环境与工具链
- 模拟器:QEMU(启动命令
qemu-system-i386 -fda ventura.img) - 编译器:MinGW GCC交叉编译器,编译参数
-m32 -ffreestanding -fno-exceptions -fno-rtti -fno-stack-protector - 汇编器:NASM
- 链接器:
ld -m i386pe -T link.ld
已尝试的验证操作
- 视频模式切换:在第二阶段引导加载程序(
stage2.asm)进入保护模式前,通过int 0x10(AX=0x0013)切换VGA模式,调试信息确认代码已执行。 - 内存访问配置:GDT采用平坦内存模型,基址
0x0,限长0xFFFFF且开启4KB粒度位,理论可访问物理地址0xA0000的VGA帧缓冲。 - 显存写入测试:在
gui命令处理器中添加极简测试代码,尝试将显存填充为亮红色(0x0C),但屏幕仍黑屏;读取0xA0000返回0x00,ESC键可正常退出。 - 段寄存器检查:保护模式下DS、ES、FS、GS均设置为GDT数据段选择器
0x10,栈地址设为0x90000。 - QEMU参数调整:尝试
-vga std、-vga cirrus及默认VGA参数,结果一致。 - 二进制布局确认:内核加载到物理地址
0x1000,控制台正常运行说明加载无误。
主要怀疑点
- GDT/页表配置错误:平坦内存模型下是否存在问题,导致无法访问
0xA0000-0xAFFFF的VGA内存窗口?粒度位是否被误解析? - 段基址未正确设置:保护模式下段基址是否未实际配置为
0x0? - 视频模式切换失败:第二阶段引导加载程序中的
int 0x10是否静默失败,导致VGA控制器仍处于文本模式,写入0xA0000的操作被忽略?
核心问题
为何在QEMU中,采用平坦内存模型的保护模式下直接写入标准VGA Mode 13h帧缓冲0xA0000无显示效果,而系统其他功能(键盘输入、文本控制台)正常?
内容的提问来源于stack exchange,提问作者xui xui
相关产品推荐
相关产品推荐

