计算机底层如何访问显卡?

1010 篇文章 11 订阅
204 篇文章 4 订阅
1. 显卡驱动是怎么控制显卡的, 就是说, 使用那些指令控制显卡, 通过端口么?
2. DirectX 或 OpenGL 或 CUDA 或 OpenCL 怎么找到显卡驱动, 显卡驱动是不是要为他们提供接口的实现, 如果是, 那么DirectX和OpenGL和CUDA和OpenCL需要显卡驱动提供的接口都是什么, 这个文档在哪能下载到? 如果不是, 那么DirectX, OpenGL, CL, CUDA是怎么控制显卡的? 
3. 显卡中的流处理器具体是做什么的, 是执行某些特殊运算么, 还是按某些顺序执行一组运算, 具体是什么, 光栅单元呢, 纹理单元呢?
4. 显卡 ( 或其他设备 ) 可以访问内存么? 内存地址映射的原理是什么, 为什么 B8000H 到 C7FFFH 是显存的地址, 向这个地址空间写入数据后, 是直接通过总线写入显存了么, 还是依然写在内存中, 显卡到内存中读取, 如果直接写到显存了, 会出现延时和等待么? 

5. 以上这些知识从哪些书籍上可以获得?


Belleve炼金术士

1. 显卡驱动是怎么控制显卡的, 就是说, 使用那些指令控制显卡, 通过端口么?
IN/OUT 指令或者地址映射,把地址线直接塞进显卡。关于地址线怎么连到显卡请翻你们的大学课本。
2. DirectX 或 OpenGL 或 CUDA 或 OpenCL 怎么找到显卡驱动, 显卡驱动是不是要为他们提供接口的实现, 如果是, 那么DirectX和OpenGL和CUDA和OpenCL需要显卡驱动提供的接口都是什么, 这个文档在哪能下载到? 如果不是, 那么DirectX, OpenGL, CL, CUDA是怎么控制显卡的?
显卡驱动实现了 API 所要求的接口,不同接口的要求是不同的。DX 是驱动实现一半 M$ 自己实现一半,OpenGL 则是驱动全权搞定。
另外现代的显卡驱动实际上是个 JIT 编译器,它会将 API 所用的指令编译成 GPU 指令,同时负责在两者之间倒腾图像。
3. 显卡中的流处理器具体是做什么的, 是执行某些特殊运算么, 还是按某些顺序执行一组运算, 具体是什么, 光栅单元呢, 纹理单元呢?
这一部分是值得大书特书的,让我慢慢说。
在最早期显卡干的事情就是把显存里的数据给倒腾成显示器信号,因为 PC 的显卡一直是  All points addressable 的,所以在早期,画图就是写显存。
但是这么做有个问题就是性能:图像的计算全部堆在 CPU,如果要绘制复杂的图像(比如 3D),CPU 的算力就会不足。此时 PC 显卡的厂商看中了游戏机的处理方法。
游戏机的显卡和 PC 很不同,很多早期的游戏机并不 All points addressable,他们的图形是按照图块存储,然后 由显卡现场拼接现场输出。此时 CPU 只需要告诉显卡要拼哪些图块,每个图块的位置大小是多少,效率大大提高。更重要的是,绘图的过程是可以高度并发的,所以 显卡很容易通过增加规模来提高效率。PC 厂商很快就效仿游戏机推出了加速卡,它们将一些常用的绘图操作固化在芯片里,用并发来提高效率。
这时的 GPU 还是固定管线时代,所谓「固定管线」说的是,绘图的功能完全是由硬件电路实现,用户最多组合它们,不能增加新功能。GPU 界第二次大革新是引入了 可编程 Shader,将原本固化的图形功能、特效等改用程序表示,GPU 就不需要再安放特化的电路,只需要堆通用电路就行了。于是现在的 GPU 就剩下三种电路: 流处理器 SP、光栅单元 ROP 和纹理单元 TMU
SP、ROP 和 TMU 分别实现了 Shader 计算、三角形点阵化和纹理访问(texture2D 之类的函数),SP 是可编程的,ROP 和 TMU 则是彻头彻尾的 ASIC。目前 DX 和 OpenGL 的渲染管线可以说是一个模子刻出来的,流程是这样:
这个过程里凡是有 Shader 参与的,都是流处理器进行计算,TMU 负责访问内存读纹理或者 buffer。Rasterizer 则是 ROP 的工作,将三角形变成平面图。
4. 显卡 ( 或其他设备 ) 可以访问内存么? 内存地址映射的原理是什么, 为什么 B8000H 到 C7FFFH 是显存的地址, 向这个地址空间写入数据后, 是直接通过总线写入显存了么, 还是依然写在内存中, 显卡到内存中读取, 如果直接写到显存了, 会出现延时和等待么?
PC 的显卡目前不能访问内存,不过近期倒是有厂商打算打通这些隔阂。内存地址映射,在最早期是通过主板的地址线走向配合片选电路实现的,之后在 Intel 弄出内存分页之后,就可以动态映射(线性地址和物理地址由页表映射),实现「动态改变地址线连线」的效果。向这些地址写数据就是通过外设总线发给外设,任何这种动作都有延迟,写内存也是有延迟的。



《计算机硬件原理》和《系统结构》这两本书来了解,系统的硬件设备如何访问吧,基本上计算机为每个连接倒系统的设备提供固定的寻址空间,用来对这台设备的控制、数据的写入和读取,而设备的操作又通过操作系统控制,操作系统底层是通过硬件指令来调用设备的,每个CPU的指令集都是一定的,通常X86系统结构的设备通过21指令,正常情况下不需要驱动程序我们可以访问显卡,而显卡厂商实际也是通过他们的显卡的引脚提供指令集合,通过这些指令集合可以访问显卡,控制显卡显示图像,但是对于普通用户使用显卡,没必要记住这么多复杂的显卡硬件指令,而且那样也太费事了,所以所有的显卡厂商都提供软接口即驱动程序,但是驱动程序是指操作显卡的指令结合的软件接口,对于这么多的硬件厂商每个厂商的指令集合都是不一样的,所以这些厂商为了用户和第三方开发,统一制定了一些标准,大家都按照这个标准来制造显卡和对外提供编程接口软件接口,这些标准就是DirectX 或 OpenGL ,用户不需要关心显卡的具体实现只需要通过提供的软件接口使用,先看会自动完成绘制的工作,显卡的指令集和内存对用户来说是透明的,用户不需要了解,而单纯从地址空间来说显卡是一个独立的系统,显卡是挂接在系统总线上的,所以系统没有办法访问先看的内存除非通过显卡提供的指令才可以,整个系统也都是在使用显卡而已。

《计算机硬件原理》和《系统结构》这两本书来了解,系统的硬件设备如何访问吧,基本上计算机为每个连接倒系统的设备提供固定的寻址空间,用来对这台设备的控制、数据的写入和读取,而设备的操作又通过操作系统控制,操作系统底层是通过硬件指令来调用设备的,每个CPU的指令集都是一定的,通常X86系统结构的设备通过21指令,正常情况下不需要驱动程序我们可以访问显卡,而显卡厂商实际也是通过他们的显卡的引脚提供指令集合,通过这些指令集合可以访问显卡,控制显卡显示图像,但是对于普通用户使用显卡,没必要记住这么多复杂的显卡硬件指令,而且那样也太费事了,所以所有的显卡厂商都提供软接口即驱动程序,但是驱动程序是指操作显卡的指令结合的软件接口,对于这么多的硬件厂商每个厂商的指令集合都是不一样的,所以这些厂商为了用户和第三方开发,统一制定了一些标准,大家都按照这个标准来制造显卡和对外提供编程接口软件接口,这些标准就是DirectX 或 OpenGL ,用户不需要关心显卡的具体实现只需要通过提供的软件接口使用,先看会自动完成绘制的工作,显卡的指令集和内存对用户来说是透明的,用户不需要了解,而单纯从地址空间来说显卡是一个独立的系统,显卡是挂接在系统总线上的,所以系统没有办法访问先看的内存除非通过显卡提供的指令才可以,整个系统也都是在使用显卡而已。




计算机的内存严格意义上分段的,如0x0000~0x00FF这段内存非配给GPIO,0x0F00~0x0F0F这段内存非配给AD或DA,其他的外设都有一段内存的映射,所谓映射实际上是这个外设的寄存器在内存上的映射,从这方面看,当在一个外设的内存映射区操作内存单元,实际上是操作这个外设本身的寄存器。一切外设的控制都是操作其寄存器!所以显卡需要占用内存的一段空间,实际上这段空间中映射的是显卡上所有的寄存器,包括一些保留空间为以后的显卡硬件升级而带来的寄存器增加,当CPU操作这段空间中的内存单元,实际上操作显卡的相应的寄存器。而显卡驱动程序就是操作这段内存空间的程序而已。



《计算机硬件原理》和《系统结构》这两本书来了解,系统的硬件设备如何访问吧,基本上计算机为每个连接倒系统的设备提供固定的寻址空间,用来对这台设备的控制、数据的写入和读取,而设备的操作又通过操作系统控制,操作系统底层是通过硬件指令来调用设备的,每个CPU的指令集都是一定的,通常X86系统结构的设备通过21指令,正常情况下不需要驱动程序我们可以访问显卡,而显卡厂商实际也是通过他们的显卡的引脚提供指令集合,通过这些指令集合可以访问显卡,控制显卡显示图像,但是对于普通用户使用显卡,没必要记住这么多复杂的显卡硬件指令,而且那样也太费事了,所以所有的显卡厂商都提供软接口即驱动程序,但是驱动程序是指操作显卡的指令结合的软件接口,对于这么多的硬件厂商每个厂商的指令集合都是不一样的,所以这些厂商为了用户和第三方开发,统一制定了一些标准,大家都按照这个标准来制造显卡和对外提供编程接口软件接口,这些标准就是DirectX 或 OpenGL ,用户不需要关心显卡的具体实现只需要通过提供的软件接口使用,先看会自动完成绘制的工作,显卡的指令集和内存对用户来说是透明的,用户不需要了解,而单纯从地址空间来说显卡是一个独立的系统,显卡是挂接在系统总线上的,所以系统没有办法访问先看的内存除非通过显卡提供的指令才可以,整个系统也都是在使用显卡而已。

计算机的内存严格意义上分段的,如0x0000~0x00FF这段内存非配给GPIO,0x0F00~0x0F0F这段内存非配给AD或DA,其他的外设都有一段内存的映射,所谓映射实际上是这个外设的寄存器在内存上的映射,从这方面看,当在一个外设的内存映射区操作内存单元,实际上是操作这个外设本身的寄存器。一切外设的控制都是操作其寄存器!所以显卡需要占用内存的一段空间,实际上这段空间中映射的是显卡上所有的寄存器,包括一些保留空间为以后的显卡硬件升级而带来的寄存器增加,当CPU操作这段空间中的内存单元,实际上操作显卡的相应的寄存器。而显卡驱动程序就是操作这段内存空间的程序而已。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值