計算機底層是如何訪問顯示卡的
連結:https://www.zhihu.com/question/20722310/answer/24824346
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
其實你可以把顯示卡想象成另外一臺機器。那麼控制另外一臺機器的辦法,就是往它的記憶體裡面寫指令和資料。往一塊記憶體裡面寫東西的辦法無非就幾種,1, 用CPU去做,那麼就是用MMIO(Memory Mapped IO)把'視訊記憶體' map到CPU定址空間,然後去讀寫,2, 用DMA控制器去做,這裡面有系統自帶的DMA控制器或者顯示卡帶的,不管哪種你可以把DMA控制器再一次看作另外一臺機器,那麼其實就是向DMA控制器寫指令讓它幫你傳一些東西到視訊記憶體去,傳的這些東西就是顯示卡要執行的命令和資料。顯示卡上的記憶體控制器,原來AGP的時候叫GART,現在不知道叫啥名了,另外SoC裡面也有類似的概念,不過大多數SoC只有一個記憶體控制器,所以不分視訊記憶體和記憶體。
把顯示卡想象成另外一臺機器。它要工作,無非也是“程式儲存”原理,上電之後,從特定的記憶體(視訊記憶體)地址去取指,然後執行指令。顯示卡的工作邏輯比CPU簡單多了,它一般就從一個環形buffer不斷的取指令,然後執行,CPU就不斷的去往環形buffer填指令。
很多時候同一個動作既可以用MMIO,也可以用DMA,比如flip framebuffer。只要把flip framebuffer的指令正確傳到環形buffer就好了。但是MMIO需要CPU參與,傳大資料的時候,打亂CPU GPU並行性,划不來。
驅動程式其實也是圍繞著這件事情來做的,Vista以前,顯示卡的驅動全都是kernel mode執行的,因為只有kernel mode才能訪問的實體地址,但是kernel mode的壞處是一旦有問題,系統就崩潰,而且kernel mode有很多侷限性,比如沒有C庫支援,浮點運算很難,代價很大等等。所以Vista之後,顯示卡驅動都分兩部分,kmd負責需要訪問實體地址的動作,其他事情都放到umd去做,包括API支援等等。所以一個3D程式執行的過程是這樣的,app generate command, call D3D runtime,D3D runtime call driver umd, driver umd system call driver kmd, kmd send command to ring buffer, graphic card exeute.
至於顯示卡驅動要完成什麼部分,這個就是所謂HAL(hardware abstraction layer)層,也就是說HAL以下由廠商提供,以上就是作業系統自帶,在HAL層以上,所有的操作都是統一的,比如畫一個點,畫一條線,驅動來對應具體的某一款晶片生成真正的命令,比如畫點,需要0x9指令,把絕對座標放到地址0x12345678(舉例)。微軟管的比較寬,umd, kmd都有HAL層,意思是即使kmd你也不能亂寫,能統一的儘量統一,比如CPU GPU external fence讀寫同步機制就是微軟統一做的。
流處理器就是說,那些處理器可以執行很多的指令,而不是就幾個固定的功能,比如原來我把幾個矩陣的乘法固定成一個操作(比如T&L單元),現在我把這個操作拆了,改成更基本的指令,比如,取矩陣元素,加乘,這樣更靈活。不過你就得多費心思去組合這些指令了,組合這些指令有個高大上的名字,shader。至於為什麼叫shader,越來越長了,不說了。相關文章
- 浮點數在計算機底層的表示及運算計算機
- 細說計算機底層整型編碼機制計算機
- 底層原理:垃圾回收演算法是如何設計的演算法
- Java I/O底層是如何工作的?Java
- 外甥女問我計算機是如何組成的?計算機
- 探索雲端計算容器底層之Cgroup
- 當代計算機程式語言簡單梳理(附計算機硬體底層工作流程)計算機
- 【計算機網路】介質訪問控制計算機網路
- Flink的底層運算元之前如何通訊
- 這一次,徹底拿下計算機網路鏈路層!計算機網路
- 【計算機網路】資料鏈路層——基於通道劃分的介質訪問控制計算機網路
- 計算機實際上是如何工作的計算機
- 計算機網路的物理層計算機網路
- 我是如何學習計算機程式設計的計算機程式設計
- js 判斷是手機訪問,還是pc訪問JS
- Laravel 底層是如何處理HTTP請求LaravelHTTP
- 【趣話計算機底層技術】一個故事看懂各種鎖計算機
- 求教測試平臺底層是如何運作的
- 【原創】探索雲端計算容器底層之Cgroup
- 計算機中的層次化儲存是個什麼鬼?計算機
- 面試必問:SpringBoot中的條件註解底層是如何實現的?面試Spring Boot
- 一網打盡:Java 程式設計師必須瞭解的計算機底層知識!Java程式設計師計算機
- 計算機的層次化架構計算機架構
- Java 底層機制Java
- nginx 是如何禁止訪問php的NginxPHP
- 請問在spring的業務層如何直接訪問 session ?SpringSession
- 如何判斷是手機還是電腦訪問網站網站
- 程式設計師面試乾貨:漫談計算機網路:物理層 ----- 雙絞線&光纖?,從最底層開始瞭解計算機網路程式設計師面試計算機網路
- 計算機系統的層次結構(計算機組成原理5)計算機
- 無法訪問遠端計算機上的事件檢視器?計算機事件
- 計算機網路(二)物理層計算機網路
- 計算機網路 -- 應用層計算機網路
- 計算機網路之物理層計算機網路
- 計算機網路--應用層計算機網路
- 計算機網路 - 應用層計算機網路
- 修改計算機名後導致Oracle無法訪問的問題修復計算機Oracle
- 如何檢查你的計算機使用的是 UEFI 還是 BIOS計算機iOS
- Serverless 解惑——函式計算如何訪問 Mongo 資料庫Server函式Go資料庫