自研OS无法写入VideoBuffer求助(附完整代码)
0x13视频模式黑屏问题排查要点
1. 确认0x13模式是否成功启动
- 调用
int 0x10设置模式后,必须检查AH寄存器的返回值:0代表成功,非0则说明模式切换失败。可以在调用后通过jc指令判断错误,临时切回文本模式用BIOS中断输出错误提示,先排除模式设置本身的问题。 - 部分虚拟机对0x13模式的支持有差异,比如QEMU可尝试添加启动参数
-vga cirrus或-vga std,验证是否是显卡模拟的兼容性问题。
2. 保护模式段配置校验
- 确保
0xA0000视频缓冲区对应的段描述符配置正确:段基址需设为0xA0000,段限长要覆盖完整VGA显存(0xA0000~0xBFFFF,共128KB),权限需设为可读写、内核级可访问。 - 检查GDT加载流程:
lgdt指令的操作数是否指向正确的GDT描述符结构,进入保护模式后是否重新加载了DS、ES等段寄存器到正确的描述符选择子——段寄存器未刷新会导致显存地址映射错误。
3. 显存写入逻辑检查
- 0x13模式(320x200 256色)下,像素(x,y)对应的显存地址为
0xA0000 + y*320 + x,要确认地址计算是否错误(比如误将步长设为640,那是16色模式的规则)。 - 若在保护模式下写入,需确认分页是否禁用:如果开启了分页,必须保证0xA0000的物理地址被正确映射到虚拟地址,否则写入操作会指向错误内存区域。
4. 代码执行流程验证
- 检查bootloader进入保护模式后的跳转逻辑,确认没有提前触发
hlt或意外跳转,导致绘制代码未执行。 - 核对内核加载地址:链接脚本是否将内核代码放在了正确的内存区域,避免覆盖bootloader关键代码或显存空间。
5. 兼容性测试
- 物理机测试时,部分旧主板要求等待垂直同步后再操作显存;虚拟机测试可切换到VirtualBox或Bochs,对比验证是否是特定虚拟机的适配问题。
内容的提问来源于stack exchange,提问作者Fab boy
相关产品推荐
相关产品推荐

