不幸的是,它有点远。
写入显存的规则取决于图形模式。在传统的视频模式中,VGA 模式 320x200 (8bpp) 是唯一一种视频内存表现得像普通内存的模式:您将一个字节对应于您想要的像素写入视频缓冲区,从 0xA000:0000(或线性 0xA0000)开始, 就这样。
对于其他 VGA (pre-SVGA) 模式,规则更复杂:当您将一个字节写入视频内存时,您会寻址一组像素,并且我早已忘记的一些 VGA 寄存器指定这些像素的哪些平面被更新以及如何使用它们的旧值。这不再只是记忆。
有SVGA模式(800x600x8bpp开头);您可以使用VESA Video Bios Extensions以独立于硬件的方式切换到它们。在这些模式下,视频内存的行为再次像内存一样,每个像素有 1、2、3 或 4 个字节,并且没有类似 VGA 的 8 像素组,您可以使用一个字节访问。问题是实模式视频缓冲区不再足够大,无法处理整个屏幕。
VESA VBE 1.2 通过提供修改内存窗口基数的函数解决了这个问题:在任何特定时刻,线性 0xA0000 处的段正在寻址视频内存的 64Kb 区域,但您可以控制整个帧缓冲区的哪些64Kb在此地址可用(基地址调整的最小单位,也称为窗口粒度,取决于硬件,但您可以依赖在 0xA0000 处映射 N*64Kb 偏移量的能力)。缺点是每次开始使用不同的 64Kb 块时都需要调用 VBE BIOS。
VESA VBE 2.0 添加了平面帧缓冲区,在保护模式下(也在虚幻模式下)在某个高地址处可用。因此,进入视频模式需要调用 VBE BIOS,而不是绘制像素。
VESA VBE 3.0 可能还不够便携,它提供了一种在保护模式下调用 VBE 函数的方法。(我没有机会尝试它,在我的“组装操作系统”时代它不存在)。
无论如何,您必须先切换到图形模式。这样做有几种变体:
- 最简单的方法是在进入保护模式之前使用 BIOS 调用。使用 VBE 2.0,您将不需要视频内存窗口调整调用。
- 另一种方法是创建一个对 BIOS 来说足够好的 V8086 模式环境。最困难的部分是将中断转发到实模式中断处理程序。这并不容易,但完成后,您将能够在 PM 中切换视频模式并使用其他一些 BIOS 功能(例如,用于磁盘 I/O)。
- 还有一种方法是使用 VESA VBE 3.0 保护模式接口。不知道它可能是多么容易或复杂。
- 真正的绝地方法是挖掘特定视频卡上的信息,通过设置其寄存器来切换模式。去过那里,过去为一些 Cirrus 卡做过 - 在 PM 中获得大的普通帧缓冲区并不太复杂。它是不可移植的,但如果目标是了解机器的内部结构,它也许正是您所需要的。