翻译原文:https://people.freedesktop.org/~marcheu/linuxgraphicsdrivers.pdf
1 硬件
在深入研究图形驱动之前,需要先了解一下图形硬件。本章不会完整的描述计算机及其图形硬件的内部工作原理,仅仅只是对它们的一个介绍,本节的目的仅仅是覆盖到后面章节中将会用到的基础知识。这里将介绍后面章节会用到的大多数的硬件概念。虽然这些概念有时候会有一些特定体系结构的限制,但是这里会尽量的保持通用型。
1.1 硬件概述
现如今的计算机都拥有同样的架构:一个中央处理器和大量的外设。为了交换数据,所有的外设都由总线互联,并且所有的通信都通过总线介绍。图1.1概括了标准计算机中外围设备的布局。
![](https://img.haomeiwen.com/i15829305/ccad93a7a81a85b7.png)
总线的主要使用者就是CPU,CPU通过总线去访问系统内存和其他外围设备。然而CPU并不是唯一一个可以读和写数据到外设的,外设本身也有直接交换信息的能力。特别的外设如果拥有不需要CPU参与而读或者写存储的能力成为DMA(Direct Memory Access,直接内存访问),通常情况下内存的传输成为一次DMA。这种类型的传输很有趣,因为它使用GPU而不是CPU来执行存储的传输。由于CPU不再需要主动工作以实现这些传输,而且它允许CPU与GPU之间有很好的异步性,因此可以获得更好的性能。通常纹理的上传和视频流使用DMA来提高性能。现如今,所有的图形处理器都具有这种能力,它包括请求总线后然后获得一段时间的总线控制权。
如果一个外设能够DMA到或者从一段不连续的存储页中(数据很容易在存储中不连续),称之为DMA具有scatter-gather属性。
然而DMA在某些情况下可能是个缺点,比如在实时操作系统上,这意味着在DMA传输的时候,CPU不能访问总线,由于DMA是异步发生的,就有可能错过任务调度的时间线。另外一个例子是一次小的DMA存储传输,CPU设置DMA花费的时间大于异步增益的时间。因此,虽然从性能角度来讲,DMA有很大的优势,但是在某些情况下应该去避免它。
1.2 总线类型
机器的外设通过总线相互连接,每一次不同设备之间的交互都经过(至少一次)总线。特别是,大多数显卡都是通过总线连接到计算机的其他部分(一个例外是,在一些嵌入式系统中,GPU直接与CPU相连接)。如图1.2所示,有很多种适合图形的总线:PCI,AGP,PCI-X,PCI-Express。我们将详细介绍的所有总线类型都是PCI总线的变体,但是其中一些类型在原始PCI设计的基础上有独特的改进。
![](https://img.haomeiwen.com/i8067685/bad612af981b5a13.png)
PCI
PCI总线是目前连接图形外设的基本总线,它关键的特性是bus mastering。这个特性允许外设在给定时钟周期内控制总线并执行完整的事务(称之为DMA)。PCI总线是一致性的,这就意味着不用显示的刷新就能使内存在不同设备上保持一致性。
AGP (Accelerated Graphics Port)
AGP本质上是一种经过修改的PCI总线,它在PCI的的基础上添加了许多额外的特性。最重要的是,它的速度快是由于有很高的时钟速率和每个时钟周期可以发送2,4,8比特的数据。AGP拥有如下三种特殊的特性:
1> AGP GART: (Graphics Aperture Remapping Table),IOMMU的一种简单形式(后面章节会讲)。它允许从系统内存中取出一组(不连续的)物理内存页,并将其导出给GPU作为一段连续的空间使用。这就增加了GPU的可用内存,并且成本很低,并且为CPU和GPU之间共享数据创建了一段方便的存储(AGP图形卡可以快速的DMA从/到这段空间,因为GART空间是系统RAM的一段,系统访问的速度比VRAM快)。一个比较重大的缺点是,GART空间是不一致的,因此在写GART之前,必须对GART执行刷新操作。另外一个缺点是硬件只能处理一段GART空间,而且必须在驱动中申请。
2> SBA(side band addressing,边带寻址):SBA包含额外的8位总线位宽被当作地址总线使用。AGP带宽可以只用于传输数据而不是数据和地址复用总线带宽。这个属性对驱动开发人员是透明的。
3> FW(Fast Write):FW允许直接发送数据到图形卡,而不需要设备发起DMA。这个属性对驱动开发人员也是透明的。
PCI-X
PCI-X是为服务器板开发的更快的PCI,仅仅只有少量的图形卡使用此总线。
PCI-Express (PCI-E)
PCI-E是新一代的PCI设备,它比简单改进版本的PCI更有优势。
最后,需要注意的是,由于架构的不同,CPU-GPU之间的通信并不总是依赖于总线。比如在一些嵌入式系统中,CPU和GPU在同一个芯片上,这种情况下CPU可以直接访问GPU。
1.3 虚拟和物理地址
本文中存储有两个不同的含义:
➢物理存储:物理存储是真实的,硬件存储,存储在硬件芯片中。
➢虚拟存储:虚拟存储是物理存储的一种转换形式,允许用户态应用程序访问连续的地址,而实际上在内存中是分段存储的。
为了简化程序,更方便的操作连续的内存空间。在申请较小连续内存空间比较方便,但是,分配更大的内存块将需要同样多的连续物理内存,由于内存碎片的原因,在启动后不久要实现这一点即使不是不可能,也是困难的。因此,在使用分散的内存块时,需要一种机制来保持应用程序访问存储的连续性。
为了达到这种效果,内存被分割成页,在本文范围内,存储页是一段连续的物理地址。为了将一系列的物理页作为连续虚拟空间,一种叫MMU的硬件使用页表将虚拟地址转换为物理地址,如图1.3所示。如果一个页不存在于虚拟地址空间(因此不存在于MMU Table),MMU可以发出信号,这就提供了基本的对不存在的页访问的机制。这点被系统用来实现高级内存编程,如交换或动态页面实例化。由于MMU只对CPU访问内存有效,虚拟地址与硬件无关,因为硬件无法将它们与物理地址匹配。
![](https://img.haomeiwen.com/i8067685/5149d6078410c89f.png)
MMU仅仅工作于CPU访问内存,对于外设来说,它有一个对等的:IOMMU,如图1.3所示,IOMMU类似于MMU,而IOMMU是转换外设的虚拟地址。IOMMU可以在主板芯片组(在这种情况下,它是在所有外围设备之间共享的)或显卡本身(在那里它将被称为AGP GART, PCI GART)上看到不同的身影。IOMMU的任务是转换外设访问的内存地址到物理地址。特别是,它允许欺骗设备,将其DMAs限制在给定的内存范围内,这对于更好的安全性和硬件虚拟化是必需的。
未完。。。
网友评论