自制操作系统中VGA内存绘制像素无显示问题排查
解决VGA像素绘制不显示的问题
核心问题
你当前的引导加载器初始化的是文本模式(0x3),而目标是VGA 320x200 8位调色板图形模式。在文本模式下,显存地址0xA0000并非活跃显示区域,因此写入该地址的像素不会被渲染。
修复步骤
1. 切换到正确的VGA图形模式
修改引导加载器中设置显示模式的代码,将文本模式替换为图形模式0x13(对应320x200分辨率、8位调色板):
; 原文本模式代码 ; mov ah, 0x0 ; mov al, 0x3 ; int 0x10 ; text mode ; 修改为图形模式 mov ah, 0x0 mov al, 0x13 ; VGA 320x200 8位色图形模式 int 0x10
2. 防止编译器优化显存写入操作
在C++的draw_pixel函数中,给指针添加volatile关键字,避免编译器优化掉对显存的写入操作:
void draw_pixel(int pos_x, int pos_y, unsigned char colour) { volatile unsigned char* location = (volatile unsigned char*)0xA0000 + 320 * pos_y + pos_x; *location = colour; }
3. 处理文本输出的兼容性
切换到图形模式后,原有的write_string函数写入的是文本模式显存地址0xB8000,这在图形模式下不会显示文本。如果仅测试像素绘制,可以暂时注释掉write_string调用,后续再实现图形模式下的文本渲染逻辑。
额外验证
- 你的GDT段描述符配置正确,平坦内存模型允许直接访问物理地址
0xA0000,无需额外调整。 - 磁盘加载内核的逻辑正常(文本输出功能已验证内核正确加载),无需修改扇区加载数量。
内容的提问来源于stack exchange,提问作者user17400329
相关产品推荐
相关产品推荐

