【问题标题】:Switching to a higher resolution切换到更高分辨率
【发布时间】:2016-04-22 23:50:07
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您已经在编写代码以在糟糕的 VGA 320x200 屏幕上显示快速动画时遇到问题,那么最好先尝试改进它,然后再使用每像素位数 3 倍的屏幕(甚至可能4 倍)和 30 (!) 倍以上的像素。

标签: c nasm osdev


【解决方案1】:

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

首先,确保您使用的是良好的模拟器/虚拟机进行测试。我使用的是 QEMU,它只以 640x480x24bpp 做任何图形的速度很慢。我切换到 VirtualBox,虽然它启动很慢,但我从未回头。

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

VESA 初始化由两部分组成 - 获取模式信息和设置视频模式。获得模式信息后,您将获得一个指向内存区域的视频基本指针,该区域是连续的,您可以在其中写入像素而无需切换存储库和执行复杂的操作。至少在 64 位模式下。

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

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

【讨论】:

  • “轻度电流硬件” - VESA 扩展至少自 90 年代初以来一直是相同的(除了添加了一些额外的支持模式),所以如果电容器如果您的硬件正常工作,VESA 也可能会正常工作。
【解决方案2】:

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

以 VESA-Xserver 为例,几乎可以与任何图形适配器配合使用(但特定型号的图形适配器要快得多)

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

【讨论】:

  • 谢谢,但我还有一个问题。我切换到 0x0118 (1024x768) VESA 模式,但速度极慢。它太慢了,没有用。我试着做一些简单的事情来测试它。我在 RAM 的某个区域有一组 2014x768 图像,我制作了一个简单的 C 程序,它一个接一个地加载它。但是,它在加载另一个图像之前等待超过一秒钟。我确信没有优化问题。我怎样才能将其加速到大约 60+ fps?
猜你喜欢
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
相关资源
最近更新 更多