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

How to draw a pixel by changing video memory map directly in a C program (without library functions)

本文关键字:绘制 映射 内存 像素 库函数 视频 程序      更新时间:2023-10-16

是否可以通过使用c程序更改RAM中屏幕(视频即监视器)内存映射中的值来显示黑点?

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

我试着运行这个程序,但由于没有提供直接访问,所以出现了分段故障。在超级用户中,程序在没有任何更改的情况下执行。

目前我正在VirtualBox中进行测试。

"real"操作系统不会使用地址0xA0000处的帧缓冲区,因此您无法通过直接写入来在屏幕上绘制。相反,你的操作系统可能有合适的视频驱动程序,可以通过各种非常复杂的方式与硬件对话。简而言之,在现代操作系统上,没有简单的方法可以做你想做的事情。

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

您可以在BIOS跳到内核后立即开始使用这些帧缓冲区并在屏幕上绘图,只需进行最少的设置。您可以在实际模式中直接完成这项工作,可能需要一百行汇编程序,或者在C中先用几行汇编程序粘合。更简单的方法是让GRUB设置硬件,引导您的最小内核,然后您可以在几行中直接写入它。

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

如果您出于学习目的对此感兴趣,我建议您创建一个简单的OGL或D3D(例如)"函数",该函数使用"假"系统分配的帧缓冲区,并使用常规硬件操作将其显示在屏幕上。

你甚至可以在计时器上设置刷新来伪造更新。

然后,你的假操作系统只需将像素写入假系统内存缓冲区,这个渲染函数就会将其显示为真实的。