据我了解,GPU 有自己的指令集,其指令由图形驱动程序生成。然后 GPU 指令被发送到 GPU。那么,在加载驱动程序之前,图形通信是如何工作的?GPU 是否必须至少实现一些基本指令,以确保计算机可以执行基本的显示任务?
答案1
“有一些基本指示吗……?”是的,确实如此。所有 GPU 都需要实现几个简单接口之一 - 它们太原始了,不能称为“指令集” - 平台固件(“BIOS”或“UEFI”)和操作系统附带的驱动程序知道如何与之通信。如今,“简单接口”的通常选择是“VGA”(“视频图形阵列”),这是最初为该标准的视频卡定义的寄存器级接口。(现在已经 30 多年了!)
例如,如果 Windows 系统上的设备管理器将显卡标识为“Microsoft 基本视频适配器”,则操作系统无法找到该卡的特定驱动程序,因此会加载与 VGA 兼容的驱动程序。
从技术上来说,Windows总是加载该驱动程序(以便它可以显示启动进度屏幕),然后(在启动的相当晚的时候)识别并加载显卡的“真实”驱动程序。
VGA 标准仅支持少数低分辨率图形模式和文本模式,不涉及我所说的“运行程序”或 GPU 上的“指令”。本质上,系统固件或“基本视频驱动程序”只是将其置于所需模式,然后将位写入位图;位图中的位直接对应于屏幕上的像素。绘制线条或曲线所需的任何算术都是在 CPU 中完成的。这是一种非常低级且缓慢的使内容显示在屏幕上的方法。但它足以用于固件的显示和简单交互、操作系统安装和早期启动进度屏幕等。
答案2
我将尝试通过解释旧硬件的工作原理来澄清这一切背后的“巫术”。现代 GPU 的工作原理并非如此,但它们模拟了 CPU 到显卡的接口。
总结
20 世纪 80 年代和 90 年代初期的图形芯片/显卡必须以极快的速度(相对于时钟速度)产生输出,因此它们不执行指令,而是使用固定电路。它们只是在运行时从 RAM 中吸取数据,因此 CPU 只需将数据转储到 RAM 中的正确位置,图形芯片就会拾取数据并将其显示在屏幕上。CPU 还可以在图形芯片上设置各种配置变量。
细节:
在 80 年代,家用电脑有一个非常“愚蠢”的图形芯片,它有一些固定的行为。如果我倒着回顾一下管道,就会明白其中的道理。
CRT 显示器
这些显示器需要模拟输入。换句话说,电压越高 = 输出越亮。彩色显示器有 3 个通道(红色、绿色和蓝色(或,例如)YUV 或 YIQ) )。这些电压调整了电子束的强度。很简单。
CRT 显示器实际上是利用电磁铁将电子束从左向右偏转,然后从稍低一点的地方重新开始,从左向右偏转,以此类推,从上到下。然后回到顶部并重复。
数模转换器
图形芯片有一个“数模”转换器(非常常用电器元件)将数字值(例如 2、4 或 8 位)转换为可以提供给显示器的电压。
扫描
图形芯片必须“跟上”电子束,向 DAC 发送正确的值,以便它能够在正确的时间输出相应的电压。(为此使用了时钟,我不会详细介绍。)这里没有时间执行指令。一切都是硬连线的,并且只占用少量固定数量的时钟周期。
视频模式
早期的芯片速度不快,RAM 也有限。因此,它们往往允许选择各种模式和其他配置参数,例如背景颜色、字体选择、光标位置和大小、调色板选择和精灵。大多数芯片都提供高分辨率的“仅字符”模式和低分辨率的逐像素模式。
三种值得注意的 VGA 模式是:
- 16(ish)色 80x25 文本模式(这基本上是 BIOS 加载屏幕的样子)
- 16 色 640x480 高分辨率模式
- 256 色 320x200 高彩色模式
绘画像素
粗略地说,根据图形系统的不同,管道看起来像这样:
当前像素位置⇒处理字符/字体/精灵/像素/配置数据⇒像素值⇒调色板⇒DAC
第二步需要从几个 RAM 位置读取。例如,在文本模式下,将查找 1 字节字符。这将形成字体表的索引。将从该表中查找一个位,指示该像素应该是前景色还是背景色。将获取第三个字节以获取该前景色/背景色。总共从 RAM 读取 3 个字节。
但这种“流动”基本上是一组简单的固定电路,其排列方式与刚才描述的流动完全一样。
内存总线接口
英特尔 CPU 有一个令人讨厌的遗留东西,称为 IO 总线,但它并不重要,所以我假装它不存在。
CPU 通过在内存总线上广播 READ 或 WRITE 请求和地址来访问 RAM。虽然大多数有效地址都会引发 RAM 的响应,但某些范围由设备相反。例如,从特定地址读取可能会给你关于键盘按键的信息。
通过写入“图形范围”的正确部分,您既可以写入屏幕内容,也可以设置显卡配置参数。“哑”图形芯片不执行任何指令。它只是继续缓慢运行,让几个字节流过其电路并输出电压。
有了 VGA,实际上就有了 RAM在显卡,因为您可以将显卡配置为在数据写入图形 RAM 之前对其进行预处理,以在某些情况下提高性能。
电子视频标准协会
VGA 之后的显卡提供了更高的分辨率和良好的色深,但工作原理类似。许多现代显卡仍然提供与此兼容的功能,以便在启动时获得更高的分辨率。但 VGA 是“万无一失”的显卡,几乎每张卡都会模拟。