VGA到底是什么,它和显卡有什么区别?

29 vga terminology graphics-card

操作系统开发教程通过直接写入 VGA 或 EGA 或 Super VGA 来精确定位到达屏幕数据,但我不明白的是写入固定地址进行显示与直接写入视频卡之间的真正区别,无论是板载或可移动?我只想基本澄清我对此问题的困惑

而且由于卡、连接接口、总线、体系结构、片上系统、嵌入式系统等中的变量不是这么简单的情况,我发现很难找到一种方法来理解这 100% 背后的想法. 固定地址会从高端 GPU 到低端板载 GPU 不同吗?为什么,为什么不呢?

托管内核并制作操作系统是我的编程目标之一,这确实是一个遥不可及的梦想。无法理解这些术语不仅在某些方面妨碍了我,而且使我在硬件方面显得很愚蠢。

额外:这些当前的一些答案谈到在 16 位的细节中使用处理器最大可寻址内存。问题是其他一些出现的问题:

1.卡本身的内存呢?这不需要屏幕数据本身的系统 RAM。

2.在高位模式下呢?并且您不能在实模式(x86)中忽略 BIOS 并仍然通过 AL 寻址内存吗?

3. 写入固定地址的概念如何在具有大量寄存器和实际微处理器或高于实际微处理器的性能的 GPU 上保持不变?

Hen*_*nes 65

从技术上讲,VGA 代表视频图形阵列,这是 1987 年推出的 640x480 视频标准。当时这是一种相对较高的分辨率,尤其是对于彩色显示器。

引入 VGA之前,我们有一些其他图形标准,例如Hercules,它显示文本(80 行 25 个字符)或相对高清的单色图形(720x348 像素)。

当时的其他标准是 CGA(彩色图形适配器),它也允许以高达 640x200 像素的分辨率显示多达 16 种颜色。结果如下:

在此处输入图片说明

最后,一个值得注意的 PC 标准是增强型图形适配器 (EGA),它允许分辨率高达 640×350 和 64 色。

(我忽略了非 PC 标准以保持相对较短。如果我开始添加 Atari 或 Amiga 标准 - 当时最多 4096 色! - 那么这将变得很长。)

然后在 1987 年 IBM 推出了 PS2 计算机。与其前辈相比,它有几个值得注意的区别,其中包括新的鼠标和键盘端口(以前鼠标使用 25 针串行端口或 9 针串行端口,如果您有鼠标的话);标准 3.5 英寸驱动器和具有高分辨率和多种颜色的新图形适配器。

这个图形标准被称为Video Graphics Array。它使用 3 排 15 针连接器将模拟信号传输到监视器。这种连接器一直持续到几年前,当时它被高级数字标准(例如 DVI 和显示端口)所取代。

VGA后

进步并没有因 VGA 标准而停止。VGA 推出后不久,出现了使用相同连接器的 800x600 S超级 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,上部 512KiB 用于附加卡、ROM 等。

这个上部区域是 VGA 卡内存被映射到的地方。您可以直接写入它,结果将显示在显示屏上。

这不仅用于 VGA,还用于同代替代品。

  G = 图形模式视频 RAM
  M = 单色文本模式视频 RAM
  C = 彩色文本模式视频 RAM
  V = Video 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:GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
0B0000: MMMMMMMMMMMMMMMMMMMMMMMMMMMMCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
0C0000:VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
0D0000:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
0E0000:rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
0F0000: RRRRRRRRRRRRRRRRRRRRRRRRbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbRRRRRRRR

(ASCII 映射的来源)。

  • 我喜欢分辨率的最高膨胀:超宽超扩展超四图形阵列。你不能称之为高清,因为有一天它不会! (3认同)
  • Nit 评论 #2:最初的 IBM PC 可能以 512/512 拆分发布,但很快更改为 640/384 拆分(这在您的源页面中引用)。图形内存从 640K 标记(十六进制 0A0000)开始。我认为没有人像“640K 边界”最终成为一个众所周知的问题那样真正意识到“512K 边界”。 (2认同)
  • @sawdust:HD15 绝对不是官方名称(但现在和现在一样好)。在`Dx-nn` 连接器系列中,`x` 是外壳的大小,`nn` 是引脚数。外壳 B 的大小与并行端口(或旧的、完整实现的 25 针串行端口)相同。外壳E和串口一样大小。所以*技术上*,VGA 15 针连接器将是 DE-15,但这从来不是原始连接器系列的一部分。AFAIK 在 IBM 用于 PS/2 MCGA、VGA 和 8514/a 之前,它甚至从未存在过。维基百科有一个很好的解释:http://en.wikipedia.org/wiki/D-subminiature (2认同)
  • @LackingConfidence 如果您想要这些卡可以提供的性能,则需要使用它们各自的专有接口。如果您不关心性能,可以使用 VGA BIOS 为您设置 VESA 帧缓冲区。查看 Linux 的 vesafb.txt 了解详细信息(当然还有 Linux 中的源代码)。 (2认同)

hai*_*img 10

写“固定地址”本质上写的视频卡直接。所有这些视频 ISA 视频卡(CGA、EGA、VGA)本质上都有一些 RAM(和寄存器)直接映射到 CPU 的内存和 I/O 空间。

因此,当您将一个字节写入某个内存位置时,该字符(在文本模式下)会立即出现在屏幕上,因为您实际上写入了位于视频卡上的内存,而视频卡只是使用了该内存。

这一切在今天看起来都非常令人困惑,特别是考虑到今天的视频卡有时被称为 VGA(它们与 1990 年代的“真正的”VGA 卡有相似之处)。然而,即使是现代显卡也能模拟这些旧设计的某些功能(您可以在大多数现代 PC 上启动 DOS 并使用直接写入视频内存的 DOS 程序)。当然,现在这一切都在视频卡的固件中进行了模拟。