計算機底層是如何訪問顯示卡的?

時間 2021-05-12 03:31:20

1樓:

顯示器顯示的資訊一直存在VRAM中(Video RAM)。由作業系統或BIOS提供的程式,借助中斷程式處理,不斷往VRAM寫資料,資料就會在顯示器中顯示

可以通過I/O埠號、IRQ、DMA、MMIO等方式訪問控制顯示卡

2樓:朱涵俊

cpu讀寫記憶體的時候,把位址發到匯流排上,匯流排上的裝置可以對某些位址進行攔截,這樣訪問的就是裝置上的記憶體,而不是真正的記憶體。isa裝置這個位址往往是固定的,比如B8000H,就是字元顯示記憶體。pci裝置這個位址可以修改,就是可程式設計的。

攔截之後記憶體就讀取不到了,變成了黑戶,B8000處的那塊記憶體就像消失了一樣。

顯示卡跟其他裝置是可以訪問記憶體的,比如DMA。裝置訪問記憶體的時候,需要通過匯流排,因此要CPU釋放匯流排控制器,裝置才能讀取記憶體。

埠跟記憶體對映,其實是一樣的,就是位址空間問題。現在基本都支援mmio,訪問埠跟訪問記憶體一樣。

顯示卡驅動獲取顯示卡快取位址,跟模式之後,就可以畫點。而其他任何圖形都可以通過畫點實現。但這樣效率比較低,不同顯示卡會提供加速,比如畫線加速,填充加速,可以通過埠,也可以通過記憶體對映實現。

往某個位址寫格式資料就能完成相應操作。除了這些,還有計算加速。比如普通cpu進行矩陣操作,要很多迴圈才能完成。

而顯示卡支援平行計算,一條指令,多條資料,多個計算單元一起參與。而普通cpu要讓多個cpu參與計算,代價非常昂貴,需要進行排程以及資源衝突處理。

3樓:霍霍霍霍霍霍霍霍

嗯嗯這個問題在大一的時候,我之前也很好奇,但是在學了組合語言和保護模式後就有所理解了。

計算機組成的重要的部分除了cpu外還有個東西叫記憶體。早期的8086計算機有1M的定址空間,這1M空間中有的部分和硬體做了位址對映,顯示卡就在其中,這裡假定顯示卡的位址是 0x12345-0x20000吧,那麼我只要對這部分記憶體進行操作,寫乙個東西就會對顯示卡進行操作,然後顯示卡再把資料處理之後顯示在螢幕之上。 不光是顯示的內容,位置,以及顯示的顏色都是可以調的。

具體的實驗在《組合語言》中有。現代的32位處理器以及x64cpu都是在原來的基礎上擴充套件的,大同小異

至於驅動,你不覺得人工直接對記憶體位址進行操作不麻煩麼?為什麼不寫乙個小程式把這些東西封裝起來呢?你只要傳對應的引數即可?

4樓:楓亦

我認為理解設計者的意圖以及要處理的問題比起陷入實現細節更為重要。

一、首先為什麼需要顯示卡?

因為大量渲染類的工作並不適合用CPU處理(此類工作簡單適合高併發),就像很多CPU都有數學協處理器一樣,你也可以把顯示卡理解為協處理器,協助完成特定的任務。

二、顯示卡是什麼?

顯示卡是一塊可程式設計晶元。

三、CPU如何控制顯示卡?

和其它可程式設計晶元一樣,比如DMA晶元、音效卡晶元等等,CPU都是通過讀寫晶元內部的暫存器控制其工作的。

四、顯示卡跟一般的可程式設計晶元有何不同?

不同之處在於,它可以執行你給它的程式。我們可以大概想象一下這個過程,

1.CPU通過匯流排寫GPU的"指令暫存器"告訴GPU,接下來我要把程式拷貝到你的視訊記憶體當中。

2.CPU把程式拷貝到視訊記憶體當中。

3.CPU寫GPU的「指令暫存器」告訴GPU,程式拷貝完成,你可以執行了。

4.GPU執行程式。

5.GPU執行完程式,通過中斷線拉乙個中斷通知CPU,你剛剛叫我執行的程式我已經搞定了。

5樓:黃恩龍

顯示卡就是乙個記憶體條。把要畫的資料寫進視訊記憶體,顯示器就把它們畫出來了。

學過彙編的都差不多知道,視訊記憶體是某個位址區域,寫進資料就在dos上顯示顏色和文字。

6樓:

上面的答主都是從軟體方面在說,我試著從另外個角度說說

由於沒接觸過中文材料,可能有些用詞不準確,見諒

5. 以上這些知識從哪些書籍上可以獲得?

題主應該是那種硬體發燒友,但是對真正的系統原理不是很了解。建議看到書有(都是大學教材級別)

Digital system 數字系統

控制基礎的電資訊,比如emphasize/deemphasize,link training以及128/130b轉碼等等。最底層是1~16條全雙工差分對。兩個PCIe裝置之間的連線就是在這一層最底下。

資料鏈路層(Data Link Layer)

主要控制資料鏈,包括接受快取的大小、流控制、重複快取(replay buffer),Ack/Nak等

交換層 (Transaction Layer)

這一層主要是和應用層交換資料

作業系統的最底層就是負責和交換層聯絡。這個就是題主問的介面了。作業系統通過寫入資料到CPU的專用暫存器(Intel的QPI匯流排格式),CPU通過這個資訊產生TLP(Transaction Layer Packet,應該叫交換層資料報吧)通過PCIe匯流排傳送到顯示卡。

顯示卡會接著告訴CPU,我收沒收到正確的資訊(Ack/Nak),如果沒有的話,Replay Buffer(重複快取)會重新傳送這個包。接受到有效的包之後顯示卡就會做出相應的操作。相應的操作就大致包含了

CfgWr (配置空間寫)

CfgRd (配置空間讀)

MemWr (記憶體寫)

MemRd (記憶體讀)

Cpl (完成)

CplD (帶資料的完成)

etc..

當操作完成的時候顯示卡會傳送Cpl或者CplD回CPU,從而告訴CPU這個操作我已經做完了。需要資料的操作例如MemRd會讓顯示卡返回CplD,反之不需要資料的操作例如CfgWr會返回Cpl。

這就是怎麼控制顯示卡。

至於暫存器的細節,題主有興趣的話再寫吧

7樓:

顯示卡雖然看起來幹很多很複雜的工作,可是真正與CPU打交道的功能並不多。就是設定一些狀態,同步一下,DMA下記憶體。驅動把複雜的工作比如shader指令等翻譯為顯示卡的指令,然後再把指令流和資料流傳給顯示卡,可能只是傳個位址,也可能需要dma到視訊記憶體。

然後顯示卡就是根據指令流不斷的執行就好了。

8樓:

先靠讀寫I/O位址空間與顯示卡溝通,切換顯示卡的模式,並為顯示卡設定乙個位址對映,將視訊記憶體位址對映到記憶體的實體地址上。接下來的就是long-term的顯示卡控制了,是通過改寫視訊記憶體以及繼續讀寫I/O位址實現。

顯示卡驅動需要實現這些介面。OpenGL的底層介面我從未了解過,也許馮東比較清楚。我說一下DirectX的。

DirectX是通過COM控制項來暴露介面的,也就是說API其實就是一些函式位址(對應著C++的虛函式),顯示卡驅動廠商需要實現Direct3D的COM物件叫做Direct3D裝置物件(這方面的記憶比較模糊,也許是錯的。待我再確認一下才好取信)。假如的確是這樣,那麼直接看D3D文件即可。

驅動本身與使用者態的COM控制項可以通過記憶體對映或者IRP的擴充套件記憶體或者管道通訊,至於最佳實踐是怎樣的就不知道了。

流處理器就是GPU上的處理核心,因為GPU是大規模並行化、超長流水線的,所以有很多的處理核心,每個處理核心就是乙個流處理器(按照解釋方式的不同,有時候每個處理核心有多個流處理器、有時候多個處理核心被稱為是乙個流處理器)。光柵單元用於將空間座標系上的頂點資料換算到平面座標系上,不過過程可能跟你想象的不太一樣,基本上真正的工作在於確定z-index。紋理單元用於貼圖。

顯示卡不能訪問記憶體,但是CPU通過前面說的記憶體對映可以訪問視訊記憶體。當然更直接的做法是利用I/O空間。記憶體與CPU、視訊記憶體、顯示卡的資料互動都需要通過資料匯流排來間接進行,這就是記憶體對映以及B8000H開始的那段空間的對映的原理。

每次匯流排進行資料交換時你都必須確保匯流排上的位址是你想訪問的位址(不過這是硬體工程師考慮的事,連系統程式設計人員都不需要深入了解),這個位址可能對應視訊記憶體、對應I/O空間或者對應記憶體等等。所以向B8000H開頭的那段記憶體實體地址寫入時直接寫到了視訊記憶體中。關於延時和等待這是乙個偽命題,因為讀寫記憶體也存在延時和等待。

十年前Intel處理器在讀寫記憶體時每次大約等待140納秒,現在的水平是30多納秒(考慮到CPU的時鐘週期是0.5納秒左右,這個延時是相當長的)。所以答案是,是的,寫視訊記憶體時會延時,而且一般比寫記憶體的延時要大的多。

關於在哪些書籍可以獲得這些知識,當務之急是學通一本《微機原理》。在圖書館你可以看到多達幾十種的各種名叫《微機原理》的書……

學到什麼樣的程度才算懂計算機底層

你猜 看了幾個高讚回答感覺都是在推銷啊。可以參考某個大佬的乙個標準 以最簡單的控制台輸出乙個hello,world為例子,如果你能清楚的知道整個過程都發生了什麼基本就夠了。 lidanger 不用懂太多。電路 通訊 晶元操作 儲存器 作業系統 編譯器就夠了。什麼是計算機底層?就是組成計算機的部件 如...

如何說服我不要轉到計算機學院學計算機?

Zzzj 瀉藥,情況差不多,化學系轉到自動化的人來答答主工科學校,化學系並不強,就大範圍來看,化學系畢業待遇也不如計算機軟微自動化什麼的 僅代表我們學校 轉到自動化之後首先是面臨的問題,班級要重新融入,要補課,沒學過電路,直接學模電數電,還是有難度的,電路數電模電實驗也挺讓人頭疼的,走了才發現,化學...

計算機專業專公升本學生學計算機很吃力,是繼續考計算機的研究生,還是直接出去找本專業相關的工作呢?

淨琉璃 你能考上名校的研嗎?如果能,那就去考,否則就去找工作。考研更適合那種本就十分優秀,只是學歷這塊還有所欠缺的人。你專公升本學歷,學習計算機知識很吃力,就沒有必要再耗費大量的時間和精力去考研了。乙個非名校沒有什麼程式設計能力的研究生和乙個三年工作經驗的本科生相比,顯然後者更吃香。所以,建議你好好...