如何通过直接在C程序中更改video内存映射来绘制像素(无需库函数)

是否可以显示一个黑点通过改变屏幕(video即显示器)的内存映射在RAM中使用交stream程序的值?

我不想使用任何库函数,因为我的主要目的是学习如何开发一个简单的操作系统。 我试图访问启动屏幕内存映射,即0xA0000(在C)。

我试图运行该程序,但得到了分段错误,因为没有提供直接访问。 在超级用户,程序得到执行没有任何改变。

目前我正在VirtualBox中testing。

一个“真实的”操作系统不会使用0xA0000地址处的帧缓冲区,所以你不能直接写入屏幕。 相反,您的操作系统可能有适当的视频驱动程序,会以各种非常复杂的方式与硬件通信。 简而言之,在现代操作系统上做你想做的事情并不容易。

另一方面,如果你想学习如何编写你自己的操作系统,那么尝试编写一个最小的内核可以输出到0xB8000的VGA文本帧缓冲区,然后在0xA0000的VGA图形帧缓冲区。

您可以开始使用这些帧缓冲区,并在BIOS跳转到内核后立即在屏幕上绘图,只需要很少的设置即可。 你可以直接从真实模式中,也许在一百个汇编器上面,也可以先用几行汇编器粘贴在C中。 更简单的是让GRUB设置硬件 ,启动你的最小的内核,然后你可以直接写几行。

简短的回答是否定的,因为现代操作系统上的帧缓冲区是由vbios和内核驱动程序确定的。 这取决于板上存在的VRAM的数量,GART的大小,物理Ram的存在以及其他一些东西(VRAM预留,CPU是否可见等)。 最重要的是,现代操作系统正在利用多个后台缓冲区并翻转硬件以在这些缓冲区之间进行显示,所以即使您可以直接戳到帧缓冲区,地址也会随帧变化。

如果你对学习的目的感兴趣,我建议创建一个简单的OGL或者D3D(例如)“函数”,它使用一个假的系统分配的帧缓冲区,并使用常规的硬件操作将其呈现给屏幕。

你甚至可以设置一个定时器刷新伪造更新。

那么你的假操作系统只会将像素写入假的系统内存缓冲区,这个渲染函数会照顾显示它,就好像它是真实的。