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

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

已尝试的验证操作

  1. 视频模式切换:在第二阶段引导加载程序(stage2.asm)进入保护模式前,通过int 0x10(AX=0x0013)切换VGA模式,调试信息确认代码已执行。
  2. 内存访问配置:GDT采用平坦内存模型,基址0x0,限长0xFFFFF且开启4KB粒度位,理论可访问物理地址0xA0000的VGA帧缓冲。
  3. 显存写入测试:在gui命令处理器中添加极简测试代码,尝试将显存填充为亮红色(0x0C),但屏幕仍黑屏;读取0xA0000返回0x00,ESC键可正常退出。
  4. 段寄存器检查:保护模式下DS、ES、FS、GS均设置为GDT数据段选择器0x10,栈地址设为0x90000。
  5. QEMU参数调整:尝试-vga std、-vga cirrus及默认VGA参数,结果一致。
  6. 二进制布局确认:内核加载到物理地址0x1000,控制台正常运行说明加载无误。

主要怀疑点

  • GDT/页表配置错误:平坦内存模型下是否存在问题,导致无法访问0xA0000-0xAFFFF的VGA内存窗口?粒度位是否被误解析?
  • 段基址未正确设置:保护模式下段基址是否未实际配置为0x0?
  • 视频模式切换失败:第二阶段引导加载程序中的int 0x10是否静默失败,导致VGA控制器仍处于文本模式,写入0xA0000的操作被忽略?

核心问题

为何在QEMU中,采用平坦内存模型的保护模式下直接写入标准VGA Mode 13h帧缓冲0xA0000无显示效果,而系统其他功能(键盘输入、文本控制台)正常?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 15:54:51