切换到更高的分辨率

时间:2016-01-17 21:39:25

标签: c nasm osdev

最近,我开始在NASM和C中开发一个操作系统。我已经制作了一个启动加载程序,内核,文件系统等。到目前为止,我直接使用VGA文本模式来写入地址{{1} }。所以,我决定切换到视频模式而不是文本模式。我选择了最大显示分辨率0x000B8000,但后来我意识到有三个问题。首先,只有256种不同的颜色。其次,分辨率太小。第三,写入地址320x200太慢了。我尝试做一些动画,但它非常迟钝,有时它会在下一帧之前等待超过一秒钟。

我在互联网上搜索了一些关于如何切换到更高分辨率的解释,例如0x000A0000以及如何使用1920x1080颜色而不是256.我发现的一切都说很难使用更高的分辨率,因为你必须为所有不同类型的图形卡开发驱动程序,而对于某些卡没有文档,所以我们必须使用逆向工程。

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

2 个答案:

答案 0 :(得分:4)

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

例如,VESA-Xserver几乎可以与任何图形适配器配合使用(但特定型号的显卡更快)

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

答案 1 :(得分:1)

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

首先,确保使用良好的模拟器/虚拟机进行测试。我正在使用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的限制。

这就意味着对于基本的高分辨率图形,不需要做很多特定于硬件的事情。如果你使用的是温和的硬件,你应该没问题。