
作業系統開發教學指出透過直接寫入 VGA 或 EGA 或 Super VGA 來獲取螢幕數據,但我不明白的是寫入固定位址進行顯示與直接寫入顯示卡(無論是板載)之間的真正區別是什麼或可拆卸?我只想基本澄清我對這個問題的困惑
由於這不是一個包含卡片、連接介面、匯流排、架構、系統單晶片、嵌入式系統等變數的簡單案例,我發現很難找到一種方法來理解這個 100% 背後的想法。高階 GPU 和低階板載 GPU 的固定位址是否會有所不同?為什麼以及為什麼不呢?
託管核心和創建作業系統是我編程的目標之一,但這確實是一個遙不可及的夢想。無法理解這些術語不僅在某些領域阻礙了我,而且讓我在硬體方面顯得很愚蠢。
額外:目前的一些答案談到在 16 位元的具體細節中使用處理器最大可尋址記憶體。問題是其他一些出現的問題:
1.卡本身的內存怎麼樣?這不需要係統 RAM 來儲存螢幕資料本身。
2.在高位模式下怎麼樣?難道你不能在實模式(x86)下忽略BIOS並且仍然通過AL尋址內存嗎?
3.在具有大量暫存器且效能等於或高於實際微處理器的 GPU 上,寫入固定位址的概念如何保持不變?
答案1
從技術上講 VGA 代表視訊圖形陣列,1987 年推出的 640x480 視訊標準。
前VGA 推出後,我們還有一些其他圖形標準,例如赫拉克勒斯它顯示文字(80 行,每行 25 個字元)或相對高清的單色圖形(720x348 像素)。
當時的其他標準是 CGA (彩色圖形適配器),還允許最多 16 種顏色,解析度高達 640x200 像素。結果如下:
最後,一個值得注意的 PC 標準是增強型圖形適配器 (EGA),它允許解析度高達 640×350、64 色。
(我忽略非 PC 標準以保持相對較短的時間。如果我開始添加 Atari 或 Amiga 標準(當時最多 4096 種顏色!),那麼這將變得相當長。)
然後在 1987 年 IBM 推出了 PS2 電腦。與前代產品相比,它有幾個值得注意的區別,其中包括用於滑鼠和鍵盤的新端口(以前的滑鼠使用 25 針串行端口或 9 針串行端口,如果你本來就有滑鼠);標準 3.5 吋驅動器和具有高解析度和多種顏色的新型圖形轉接器。
這個圖形標準被稱為視訊圖形陣列。它使用 3 行 15 針連接器將類比訊號傳輸到顯示器。這種連接器一直持續到幾年前,後來被 DVI 和顯示器連接埠等高級數位標準取代。
VGA後
VGA 標準的進步並沒有停止。 VGA 推出後不久就出現了新標準,例如 800x600S上層VGA(SVGA),它使用相同的連接器。 (Hercules、CGA、EGA 等都有自己的連接器。您無法將 CGA 顯示器連接到 VGA 卡,即使您嘗試顯示足夠低的解析度也是如此)。
從那時起,我們已經轉向更高解析度的顯示器,但最常用的名稱仍然是 VGA。即使正確的名稱是 SVGA、XVGA、UXGA 等。
(圖片由維基百科提供)
另一個被稱為“VGA”的東西是與原始 VGA 卡一起使用的 DE15 連接器。這種通常為藍色的連接器並不是將類比「VGA 訊號」傳輸到顯示器的唯一方法,但它是最常見的。
左:DB5HD 右:替代 VGA 連接器,通常用於獲得更好的品質)
「VGA」的第三種用法是描述圖形卡,即使該卡可能產生與 VGA 完全不同的解析度。這種使用在技術上是錯誤的,或者至少應該是“VGA 相容卡”,但普通話並沒有什麼區別。
那留下寫入VGA
這來自於 IBM XT 上的記憶體劃分方式。 CPU 最多可以存取 1MiB (1024KiB) 的記憶體。底部 512KiB 預留給 RAM,上部 512KiB 預留給附加卡、ROM 等。
此上部區域是 VGA 卡記憶體映射到的位置。您可以直接寫入它,結果會顯示在顯示器上。
這不僅用於 VGA,也用於同代替代品。
G = 圖形模式視訊 RAM M = 單色文字模式影片 RAM C = 彩色文字模式影片 RAM V = 視訊 ROM BIOS(在 PS/2 中為“a”) a = 適配板 ROM 和專用 RAM(空閒 UMA 空間) r = 附加 PS/2 主機板 ROM BIOS(非 PS/2 系統中免費 UMA) R = 主機板 ROM BIOS b = IBM Cassette BASIC ROM(在 IBM 相容機中為“R”) h = 高記憶體區域 (HMA)(如果載入了 HIMEM.SYS)。 常規(基礎)記憶體: 第一個 512KB(或 8 個 64KiB 塊)。 上部記憶體區域 (UMA): 0A0000:GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG 0B0000:MMMMMMMMMMMMMMMMMMMMMMMMMMMMCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 0C0000:VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0D0000:啊啊啊啊啊啊啊啊啊啊啊啊 0E0000: 嗚嗚嗚嗚嗚嗚嗚嗚嗚嗚嗚嗚嗚嗚嗚嗚嗚嗚嗚嗚 0F0000: RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
(來源ASCII 映射)。
答案2
寫入“固定地址”曾是本質上是直接寫入視訊卡。所有這些視訊 ISA 視訊卡(CGA、EGA、VGA)本質上都有一些直接映射到 CPU 記憶體和 I/O 空間的 RAM(和暫存器)。
因此,當您向某個內存位置寫入一個位元組時,該字元(在文字模式下)立即出現在螢幕上,因為您實際上寫入了位於視訊卡上的內存,而視訊卡只是使用了該內存。
這一切在今天看起來非常令人困惑,特別是考慮到今天的顯示卡有時被稱為 VGA(它們與 20 世紀 90 年代的「真正的」VGA 卡非常相似)。然而,即使是現代卡片也會模擬這些舊設計的一些功能(您可以在大多數現代 PC 上啟動 DOS 並使用直接寫入視訊記憶體的 DOS 程式)。當然,現在這一切都在顯示卡的韌體中進行了模擬。
答案3
實際上並沒有什麼區別:如果您要寫入視訊記憶體的位址,那麼硬體會將其路由到視訊卡。
如果您正在編寫自己的作業系統,則可能需要做大量工作才能讓顯示卡按照您想要的方式映射其內存,首先是掃描 PCI 總線以查找顯示卡。
答案4
到目前為止,答案已經解釋了舊顯示卡的工作原理是將視訊記憶體映射到處理器的位址空間。這是卡牌自己的記憶。北橋知道將此映射記憶體的請求重新導向到 VGA 裝置。
除此之外,還有 VGA 相容卡的大量擴充和新模式。這導致了 VESA BIOS 擴展 (VBE) 的創建,它通過int 10h
.這支援基本的2D加速(BitBlt)、硬體遊標、雙/三緩衝等。這通常也使用卡內部的內存,北橋像經典 VGA 一樣執行重定向。這是利用全彩/全解析度圖形最簡單的方法。
接下來我們介紹一些不使用 BIOS 來存取 GPU 的直接方法,它提供了對與 VBE 相同的功能以及可能的其他功能的存取。我的理解在這裡很模糊。我認為這個介面是特定於設備的,但我對此完全不確定。
然後是GPU接口,可以支援3D加速/GP-GPU運算等。