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

自制操作系统中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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:27:28