關於記憶體位址和視訊記憶體位址,現在的視訊記憶體動不動就2G了,分配給視訊記憶體的位址段是不是和8086已經不一樣了?

時間 2021-05-31 20:30:59

1樓:enpeng xu

這個是歷史遺留下來的,確切說是bios為了提供vesa相容模式給弄的。在沒有bios的板子上,這個位址自然和圖形沒任何關係。

2樓:

這個framebuffer應該只和顯示(display)有關,純2D領域的問題。

顯示(display)有幾套方案,對應幾套暫存器。

從軟體工程師角度理解:最古老的是VGA模式,再接著是VESA模式。在這個層面,是沒有3D的。

再接著就是現代的帶MMU模式,此時的所謂的framebuffer,個人理解是沿用傳統的概念,但只是從視訊記憶體裡劃出的一部分專門用於最終顯示(display)的記憶體,一般這塊記憶體已經不是bios初始化時劃定的那塊0xbffff物理記憶體了,剩餘的大量空間,一塊用於mmu本身的配置,另一塊就是可以使用的視訊記憶體,用於存放texture,GPU指令等資料,這個一般都是3D來用,暫且不表。

系統啟動的顯示,一般有2個階段,多則3個階段。分別是1. bios初始化的vga模式 (實模式)2.

VESA模式或增強的fb模式 (保護模式)3.自帶MMU的顯示驅動接管後的fb模式 (保護模式)

3樓:北極

原來的8086cpu設計的時候,位址空間有一塊區域(640K-1M)之間,有一塊作為視訊記憶體使用

這裡你說的預留的位址,是指實體地址,這一段位址的準確範圍是000A0000-000BFFFF,不管是32位還是64位CPU,這一段物理記憶體位址一直都保留給視訊記憶體使用,不區分32位還是64位,也不區分保護模式還是實模式

以下是我電腦上的截圖(系統環境為Win7 64位,CPU是i7 4770K):

可見這一段記憶體至今仍然是留給顯示卡使用的。

那麼現在為什麼不能直接用這段記憶體了?

因為現在的軟體都執行在保護模式下,訪問的位址都是虛擬位址,而並非實體地址,包括你使用cmd命令開啟的環境,都是虛擬位址,雖然32位XP裡能用debug命令向000B8000上寫資料並能顯示在cmd的介面裡,但本質上,這都是虛擬出來的

如果要想用這段視訊記憶體怎麼辦?

自己寫乙個簡易的作業系統,不啟動顯示卡的各種圖形加速功能,CPU進入保護模式後在GDT裡對映乙個4G的資料段,與實體地址一致,那麼向000B8000上寫資料,就會像過去DOS一樣顯示在螢幕上,所以保護模式下也可以訪問這一段記憶體。所以,保護模式下,也可以用它。

顯示卡那麼多視訊記憶體是怎麼對映的?

再看截圖:

有很多記憶體位址被對映給視訊記憶體了,就是通過這種對映關係,把一些實體地址留給視訊記憶體,使得CPU能像訪問記憶體一樣訪問視訊記憶體資源。

當然,實際情況是,2G視訊記憶體未必完全對映,而是只對映一部分位址,顯示卡有一些開放的暫存器能夠控制哪部分視訊記憶體對映過來,這樣就能使得CPU在使用比較少的實體地址範圍的情況下,訪問全部的視訊記憶體。

還有乙個很有意思的事情:在虛擬機器裡,找到對映的高位址部分的第一塊記憶體區域,寫乙個能直接訪問實體地址的程式(比如乙個驅動),去讀這一塊記憶體,然後寫到檔案裡,再用螢幕截圖,也寫到檔案裡,會發現截圖的內容和視訊記憶體裡讀出來的內容基本上是一樣的。

4樓:秦二

那一段位址空間是A0000-BFFFF,現在的X86主機仍然把這一段位址空間分配給顯示卡,裝置管理器-顯示介面卡-資源分配裡面可以看得到,這個是傳統VGA位址空間。

Linux頁表中虛擬記憶體位址如何對映到硬碟資料塊位址

我來回答一下,不確定對不對。首先每個程序都有自己的名字空間,你說當發現需要的資料不在物理記憶體中的時候需要去磁碟讀取資料到記憶體中!這個問題是首先程序是知道自己需要什麼資料的,它才知道這些資料在不在物理記憶體中!這些資料是什麼呢?比如說檔案的元資料這是很重要的,經常都是快取在記憶體中!額如果說元資料...

記憶體位址是12位16進製制數,那麼對應的指標需要多少位元組?

既然是 非專業的業餘愛好者 那我告訴你,你的問題對於程式設計來說沒有意義。沒必要關心指標佔多少位元組。另外兩個位元組我推測是用來儲存這個指標所指變數的長度。推測無據,也無意義。例如 int 的指標 p,使用 p 1,則對應的位址偏移4個位元組。不一定。標準答案是偏移sizeof int 個位元組。至...

當兩個CPU核心要求讀寫同一記憶體位址時,其後果是未定義行為嗎?

楊華 結果可以預期 多核cpu中,其實記憶體只有乙個,同時申請會對指令進行排序。具體實現涉及多級cache的coherence問題會比較複雜,不過可以先抽象掉。fyi Zijie He 不會,如果正好只有兩個處理器指令寬度的記憶體寫同時發生,那只有乙個會生效,另乙個會被改寫或者忽略。但是兩個處理器可...