在加载驱动程序之前,CPU 如何与 GPU 通信?

Vor*_*Dev 25 gpu graphics-card drivers

据我了解,GPU 有自己的指令集,其指令由图形驱动程序生成。然后将 GPU 指令发送到 GPU。那么,在加载驱动程序之前,图形通信是如何工作的呢?是否有一些 GPU 必须至少实现的基本指令,以确保计算机可以执行基本的显示任务?

Jam*_*han 33

“有什么基本的指示吗……?” 对,就是这样。所有 GPU 都需要实现几个简单接口之一——它们太原始,不能称为“指令集”——操作系统中包含的平台固件(“BIOS”或“UEFI”)和驱动程序知道如何与之交谈. 如今,“简单接口”的通常选择是“VGA”(“视频图形阵列”),这是最初为该标准的视频卡定义的寄存器级接口。(现在 30 多岁了!)

例如,如果 Windows 系统上的设备管理器将图形卡标识为“Microsoft 基本视频适配器”,则操作系统无法找到该卡的特定驱动程序,而是加载了与 VGA 兼容的驱动程序。

好吧,从技术上讲,Windows总是加载该驱动程序(因此它可以显示例如启动进度屏幕),然后(在启动相当晚的时候)识别并加载显卡的“真实”驱动程序。

VGA 标准只支持少数低分辨率图形模式和文本模式,不涉及我所谓的“运行程序”甚至 GPU 上的“指令”。本质上,系统固件或“基本视频驱动程序”只是将其置于所需的模式,然后将位写入位图;位图中的位直接对应于屏幕上的像素。绘制直线或曲线所需的任何算术都在 CPU 中完成。这是一种让内容显示在屏幕上的非常低级和缓慢的方式。但对于固件的显示和简单的交互、操作系统安装和早期启动进度屏幕等,这已经足够了。

维基百科:视频图形阵列

  • Windows 更可能使用 [VESA BIOS 扩展 (VBE)](https://en.wikipedia.org/wiki/VESA_BIOS_Extensions) 作为其基本适配器。VBE 得到了广泛的支持,允许 16-24 位颜色和高达 1600x1200 像素。 (9认同)
  • 它不会是 VESA BIOS 扩展,因为在引导程序的最早阶段完成后,Windows 完全不会为 _anything_ 调用 BIOS/UEFI 代码。 (3认同)
  • 我见过一些计算机,包括我的笔记本电脑,其中“旋转点”Windows 启动屏幕的分辨率极低(320x200,我会说,VGA 的 256 色模式),然后快速切换到更高的分辨率。 (2认同)

Art*_*ius 18

我将尝试通过解释旧硬件的工作原理来澄清这一切背后的“巫毒”。现代 GPU 不是这样工作的,但它们模拟 CPU 到图形卡的接口。

tl;博士

80 年代和 90 年代初的图形芯片/卡必须极快地产生输出(相对于时钟速度),因此它们不执行指令,而是具有固定电路。他们只是在执行过程中从 RAM 中吸取数据,因此 CPU 只需要将 RAM 中的数据转储到正确的位置,图形芯片就会将其拾取并扔到屏幕上。CPU 还可以在图形芯片上设置各种配置变量。

细节:

在 80 年代,家用计算机有一个非常“愚蠢”的图形芯片,它有一些固定的行为。如果我向后通过管道,这将是最有意义的。

CRT 显示器

这些监视器需要模拟输入。换句话说,更高的电压 = 更亮的输出。彩色监视器有 3 个通道(红色、绿色和蓝色(或,例如YUV 或 YIQ)。这些电压调整了电子束的强度。简单的东西。

CRT 显示器字面上使用电磁体从左到右偏转电子束,然后再从低一点开始,从左到右,从上到下以此类推。然后回到顶部并重复。

数模转换器

图形芯片有一个“数模”转换器(一种非常常见的电子元件)。这将数字值(例如 2、4 或 8 位)转换为可以提供给监视器的电压。

扫描

图形芯片必须“跟上”电子束,向 DAC 发送正确的值,以便它可以在正确的时间输出相应的电压。(这里使用了时钟,我不会详细介绍。)这里没有时间执行指令。一切都是硬连线的,需要固定数量的时钟周期。

视频模式

早期的芯片速度不是很快,而且内存有限。因此,它们倾向于允许选择各种模式和其他配置参数,例如背景颜色、字体选择、光标位置和大小、调色板选择和精灵。大多数提供了高分辨率的“仅字符”模式和低分辨率的逐像素模式。

三种值得注意的 VGA 模式是:

  • 16(ish) 色 80x25 文本模式(这本质上是 BIOS 加载屏幕的样子)
  • 16 色 640x480 高分辨率模式
  • 256 色 320x200 高色模式

绘画像素

粗略地说,根据图形系统,管道看起来像这样:

当前像素位置 ? 处理字符/字体/精灵/像素/配置数据?像素值 ? 调色板?数模转换器

这是需要从几个 RAM 位置读取的第二步。例如,在文本模式下,将查找 1 字节字符。这将形成字体表的索引。将从该表中查找一点,指示该像素应该是前景色还是背景色。将获取第三个字节以获得该前景色/背景色。总而言之,从 RAM 中读取了 3 个字节。

但是这个“流程”几乎是一组简单的固定电路,它们的排列方式与刚才描述的流程完全一样。

内存总线接口

英特尔 CPU 有一个令人讨厌的遗留东西,称为 IO 总线,但这并不重要,所以我会假装它不存在。

CPU 通过在内存总线上广播 READ 或 WRITE 请求和地址来访问 RAM。尽管大多数有效地址会引起 RAM 的响应,但某些范围由设备处理。例如,从特定地址读取可能会为您提供有关键盘按键的信息。

通过写入“图形范围”的右侧部分,您既可以写入屏幕内容,也可以设置显卡配置参数。“哑”图形芯片不执行任何指令。它只是继续缓慢前进,有几个字节流过它的电路并输出电压。

使用 VGA,显卡实际上有 RAM ,因为您可以将显卡配置为在数据写入图形 RAM 之前对其进行预处理,以在某些情况下提高性能。

VESA

VGA 之后的显卡提供更高的分辨率和良好的色彩深度,但工作原理相似。许多现代显卡仍然提供与此兼容,以在启动期间允许更高的分辨率。但 VGA 是“万无一失”的,几乎每张卡都会效仿。