切换到更高分辨率

Switching to a higher resolution

最近开始开发NASM和C的操作系统,已经做了boot loader,kernel,filesystem等,目前直接用VGA text mode写地址 0x000B8000。所以,我决定切换到视频模式而不是文本模式。我选择最大显示分辨率320x200,但后来我意识到存在三个问题。首先,只有 256 种不同的颜色。其次,分辨率太小。第三,写入地址 0x000A0000 太慢了。我尝试做一些动画,但它非常卡顿,有时在下一帧之前等待超过一秒。

我在互联网上搜索了一些关于如何切换到更高分辨率(例如 1920x1080 以及如何使用 256*256*256 颜色而不是仅仅 256 种颜色的解释。我发现的所有内容都表明它是很难使用更高的分辨率,因为您必须为所有不同类型的显卡开发驱动程序,并且对于某些显卡没有文档,因此我们必须使用逆向工程。

我真的很想在我的操作系统中引入高分辨率图形。真的很难还是有什么简单的方法?关于如何解决这个问题有什么建议吗?

几乎每个图形适配器都支持 VESA 帧缓冲区语义,您几乎可以配置每个视频模式。缺点是您不能使用供应商特定的功能(加速图形等)

例如 VESA-Xserver 几乎适用于任何图形适配器(但特定型号的适配器要快得多)

另请参阅:https://en.wikipedia.org/wiki/VESA_BIOS_Extensions

你可以在汇编中做高分辨率的 VESA 图形,它应该足够快(在你学习的开始阶段,而不是做非常花哨的 3d 东西,尤其是)。

首先,请确保您使用的是一台好的 emulator/virtual 机器进行测试。我当时使用的是 QEMU,它可以减慢仅以 640x480x24bpp 的速度处理任何图形的速度。我切换到 VirtualBox,虽然它启动很慢,但我从未回头。

至于编程部分,我鼓励您看一个名为 Pure64 的项目。您可以在 GitHub 上找到它。转到 src/init/isa.asm 并查看文件末尾 - 有一些代码可以进行 VESA 初始化。我实际上正在使用 Pure64 来设置一个干净的 64 位环境,并且我正在做 VESA 图形,所以我可以说它工作正常。

VESA init 由两部分组成 - 获取模式信息和设置视频模式。获得模式信息后,您将获得一个视频基址指针,指向一个连续的内存区域,您可以在其中写入像素而无需切换组和做复杂的事情。至少在 64 位模式下。

我遇到的唯一问题是我无法使 32bpp 模式工作。我可以做 24bpp,即 RRGGBB - 每个像素 3 个字节(完全像 HTML/CSS 颜色代码)。对于二进制计算机上由 3 个字节组成的所有内容,这会使某些事情变得更加复杂(至少对于初学者而言)。让每个像素 4 个字节工作仍然让我望而却步。也许这是 VirtualBox 或其他东西的限制。

这意味着对于基本的 hi-res 图形,不需要做很多 hardware-specific 的事情。如果您使用的是较新的硬件,应该没问题。