操作系统开发教程指出,通过直接写入 VGA 或 EGA 或 Super VGA 可以获取屏幕数据,但我不明白的是,写入固定地址进行显示和直接写入视频卡(无论是板载还是可移动)之间有什么真正的区别?我只是想在我的问题上对这个问题的困惑进行基本的澄清
而且由于这不是一个简单的情况,卡、连接接口、总线、架构、片上系统、嵌入式系统等都有变量,我发现很难找到一种方法来 100% 理解这背后的想法。高端 GPU 和低端板载 GPU 的固定地址会有所不同吗?为什么会有所不同?
我编程的目标之一就是托管内核并开发操作系统,但这确实是一个遥不可及的梦想。不理解这些术语不仅会阻碍我在某些领域的发展,还会让我在硬件方面显得很愚蠢。
额外:其中一些当前答案提到在 16 位细节中使用处理器的最大可寻址内存。问题是以下一些其他出现的问题:
1.卡本身的内存怎么样?它本身不需要系统 RAM 来存储屏幕数据。
2.在高位模式下会怎么样?在实模式(x86)下,您不能忽略 BIOS 并仍然通过 AL 寻址内存吗?
3.在具有大量寄存器且性能等于或高于实际微处理器的 GPU 上,写入固定地址的概念如何保持不变?
答案1
从技术上讲,VGA 代表视频图形阵列,1987 年推出的 640x480 视频标准。在当时,这是一个相对较高的分辨率,尤其是对于彩色显示器而言。
前VGA 推出后,我们又推出了一些其他图形标准,例如大力神它可显示文本(80 行,每行 25 个字符)或相对高清的单色图形(720x348 像素)。
当时的其他标准是 CGA(彩色图形适配器),还允许使用最多 16 种颜色,分辨率最高可达 640x200 像素。结果如下:
最后,值得注意的 PC 标准是增强型图形适配器 (EGA),它允许高达 640×350 的分辨率和 64 种颜色。
(我忽略了非 PC 标准以使其相对较短。如果我开始添加 Atari 或 Amiga 标准 - 当时最多 4096 种颜色! - 那么它会变得相当长。)
1987 年,IBM 推出了 PS2 电脑。它与前代产品相比有几个值得注意的区别,包括新的鼠标和键盘端口(以前鼠标使用 25 针串行端口或 9 针串行端口,如果你需要一个鼠标;一个标准的 3.5 英寸驱动器和一个具有高分辨率和多种颜色的新型图形适配器。
这个图形标准被称为视频图形阵列。它使用 3 排 15 针连接器将模拟信号传输到显示器。这种连接器一直使用到几年前,后来被 DVI 和显示端口等更高级的数字标准所取代。
VGA 之后
VGA 标准的进步并未止步于此。VGA 推出后不久,又出现了新的标准,例如 800x600年代上 VGA(SVGA),使用相同的连接器。(Hercules、CGA、EGA 等都有自己的连接器。您无法将 CGA 显示器连接到 VGA 卡,即使您尝试显示足够低的分辨率也不行)。
从那时起,我们开始转向更高分辨率的显示器,但最常用的名称仍然是 VGA。尽管正确的名称应该是 SVGA、XVGA、UXGA 等等。
(图片来自维基百科)
另一个被称为“VGA”的东西是与原始 VGA 卡一起使用的 DE15 连接器。这种通常为蓝色的连接器不是将模拟“VGA 信号”传输到显示器的唯一方式,但它是最常见的。
左:DB5HD 右:替代 VGA 连接器,通常用于获得更好的质量)
“VGA” 的第三种用法是描述显卡,即使该显卡可能产生与 VGA 完全不同的分辨率。这种用法在技术上是错误的,或者至少应该是“VGA 兼容卡”,但普通用语不会造成这种差异。
那么写入 VGA
这是由于 IBM XT 上的内存划分方式造成的。CPU 最多可以访问 1MiB (1024KiB) 的内存。底部 512KiB 保留给 RAM,顶部 512 KiB 保留给附加卡、ROM 等。
这个上方区域是 VGA 卡内存映射的位置。您可以直接写入该区域,结果将显示在显示屏上。
这不仅适用于 VGA,也适用于同一代替代品。
G = 图形模式视频 RAM M = 单色文本模式视频 RAM C = 彩色文本模式视频 RAM V = 视频 ROM BIOS(在 PS/2 中为“a”) a = 适配板 ROM 和专用 RAM(可用 UMA 空间) r = 附加 PS/2 主板 ROM BIOS(非 PS/2 系统中的免费 UMA) R = 主板 ROM BIOS b = IBM Cassette BASIC ROM(在 IBM 兼容机中为“R”) h = 高端内存区域 (HMA),如果加载了 HIMEM.SYS。 常规(基本)内存: 前 512KB(或 8 个 64KiB 块)。 上部内存区域 (UMA): 0A0000:GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG 0B0000:MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 0C0000:VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0D0000:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0E0000:rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr 0F0000:RRRRRRRRRRRRRRRRRRRRRRRRbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbRRRRRRRR
(来源ASCII 地图)。
答案2
写入“固定地址”曾是本质上是直接写入视频卡。所有这些视频 ISA 视频卡(CGA、EGA、VGA)本质上都有一些 RAM(和寄存器)直接映射到 CPU 内存和 I/O 空间中。
因此,当您将一个字节写入某个内存位置时,该字符(在文本模式下)会立即出现在屏幕上,因为您实际上是将其写入位于视频卡上的内存中,而视频卡只是使用了该内存。
如今这一切看起来非常令人困惑,尤其是考虑到如今的视频卡有时被称为 VGA(它们与 20 世纪 90 年代的“真正”VGA 卡很相似)。然而,即使是现代卡也模拟了这些旧设计的一些功能(您可以在大多数现代 PC 上启动 DOS 并使用直接写入视频内存的 DOS 程序)。当然,如今这一切都是在视频卡的固件中模拟的。
答案3
实际上没有区别:如果您正在写入视频内存的地址,那么硬件就会将其路由到视频卡。
如果您正在编写自己的操作系统,则可能需要做大量工作来让显卡按照您的需要映射其内存,首先要扫描 PCI 总线来查找显卡。
答案4
到目前为止,答案已经解释了旧显卡的工作原理,即将视频内存映射到处理器的地址空间中。这是显卡自己的内存。北桥知道将此映射内存的请求重定向到 VGA 设备。
除此之外,还有许多适用于 VGA 兼容卡的扩展和新模式。这导致了 VESA BIOS 扩展 (VBE) 的诞生,它通过 进行操作int 10h
。它支持基本的 2D 加速 (BitBlt)、硬件光标、双/三缓冲等。这是在任何支持的分辨率(包括高分辨率)下实现全彩色显示的基本方法。这通常也使用卡内部的内存,北桥像经典 VGA 一样执行重定向。这是利用全彩色/全分辨率图形的最简单方法。
接下来,我们将介绍一些无需使用 bios 即可直接访问 GPU 的方法,该方法可以访问与 VBE 相同的功能,甚至可能还有其他功能。我对这里的理解很模糊。我认为这个接口是特定于设备的,但我对此一点也不确定。
然后还有可以支持 3D 加速/GP-GPU 计算等的 GPU 接口。这绝对需要制造商提供的驱动程序或规格才能充分使用,而且即使是同一制造商的设备之间也经常存在很大差异。