How do I set a graphics mode

来自osdev
跳到导航 跳到搜索

当PC第一次启动时,它被设置为标准的已知VGA文本模式。 但是在某些时候,你将希望开始在屏幕上绘制像素而不是文本。 这要求你从文本模式切换到“图形”模式。 在16位模式下,通过调用中断0x10的不同函数,你可以轻松地使用BIOS在不同图形模式之间切换。 但是,一旦进入保护模式,事情就会变得更加困难。

使用UEFI

对于EFI,标准是通用图形适配器(UGA-Universal Graphics Adapter)。 它有严重的缺点 (例如无法报告帧缓冲区地址),因此在UEFI中,它被 图形输出协议 (GOP-Graphics Output Protocol) 取代。

使用BIOS

你在PC中找到的每个视频卡都附带一段代码,可以对其进行初始化,即视频BIOS。 该bios预计将在 实模式 运行,并且只要你在,你就可以通过在寄存器中使用正确的值调用软中断int 0x10 直接访问所有函数。 如果你的内核是基于某个教程的,你可能不能这么做,因为对于几乎所有的教程,你都处于保护模式,而不是真实模式。

许多显卡有两个接口,一个VGA interface用于低分辨率,VESA VBE用于高分辨率。 或者,你可以编写自己的代码来直接处理图形硬件。

保护模式长模式中,无法直接访问BIOS接口。 有很多方法可以用来继续使用它。 它们都通过设置或模拟实模式并以这种方式调用中断来工作。

通过BIOS绘图的方法

  • 回到实模式,然后调用BIOS。 最简单的解决方案,也是最丑陋的。 执行此操作时,请注意将所有内容恢复为实模式值。
  • 使用 虚拟8086模式。 保护模式下最常见的良好解决方案。 这样,你就可以从虚拟机风格的环境中运行BIOS,从而保持对进程的控制。 然而,长模式下虚拟8086模式不可用。
  • 编写/使用模拟器。 最慢和最繁琐的方法,但它的优势是它可以在任何条件下工作,包括长模式和其他平台。

编写特定的驱动程序

另一种方法是根本不使用BIOS。 在这种情况下,你必须编写自己的驱动程序才能与硬件进行交互。

在不使用BIOS的情况下获取图形模式的最简单方法是开发重用现有VGA驱动程序。 这为你提供了几乎所有硬件上的所有低分辨率模式,并且比设置任何类型的虚拟机更容易完成。

但是,如果要支持高分辨率,则必须为你希望OS支持的 每个图形卡 编写驱动程序。 只有当你有不止一次生命要浪费时才推荐这么干。 请注意,许多视频卡都没有可用的“官方”文档, 并且你需要求助于二手信息 (往往是不完整的) 和现有的 驱动程序实现。 如果你想要硬件加速,这是唯一的方法。