關於視訊記憶體位址問題

2021-06-13 09:33:50 字數 2491 閱讀 3464

**:

為什麼有些書說視訊記憶體首位址為a00000,有的說再b8000?

顯示模式不同。 

我記得b800是單色 

a000是彩色(圖形?)

我想你是在dos下編寫吧:) 

不同的顯示模式首位址不一樣 

a000000l通常是0x13 

b8000那是文字模式

如果是dos下編,注意以下幾點: 

1。所有圖形方式中顯示緩衝區起始位址都是 a000:0000,即 0xa0000000 

2。如果程式工作在保護模式,則起址應為 0xa0000; 

3。顯示緩衝區長度永遠為 0xffff 位元組。 

4。0x13h 以上的圖形模式中,超出的位元組應通過切換顯示頁(其實就是顯示卡上視訊記憶體中的 

起始指標)實現。 

5。直接顏色模式和間接顏色模式對記憶體的組織是不同的。  

1.b800:0000是文字模式(如3模式)視訊記憶體起始位址 

2.13模式以上通過修改顯示卡某個暫存器做頁面切換。

windows下不能直接訪問視訊記憶體,最接近的方法就是directx。

怎麼樣才能直接讀取視訊記憶體的內容?? 是用directx的directshow?還是direct draw?怎麼用呢?那個函式? 

有沒有api可以直接杜視訊記憶體的?你去看看《深入 directx7.0 》,裡面有詳細介紹! 

或者看msdn,directx是專門對硬體程式設計的!

用directdraw,建立primarysu***ce,然後lock之,就可以得到視訊記憶體位址,讀寫完後再unlock()。具體的有點複雜,一句兩句說不清,最好看書或參考msdn。 

算了,還是給你**吧。 

//初始化 

hresult hret = directdrawcreateex( null, (void**)&m_pdirectdraw, iid_idirectdraw7, null ); 

if(hret != dd_ok) 

// step 2: set the cooperative level 

hret = m_pdirectdraw->setcooperativelevel(hwnd, ddscl_exclusive | ddscl_fullscreen); 

// step 3:set display mode 

hret = m_pdirectdraw->setdisplaymode( gameres_x, gameres_y, gamecolorbitdepth, 0, 0 ); 

// step 4: create a primary su***ce with one backsu***ce 

ddsu***cedesc2 ddsd; 

zeromemory( &ddsd, sizeof(ddsd)); 

ddsd.dwsize = sizeof(ddsd); 

ddsd.dwflags = ddsd_caps | ddsd_backbuffercount; 

ddsd.ddscaps.dwcaps = ddscaps_primarysu***ce | ddscaps_flip | ddscaps_complex; 

ddsd.dwbackbuffercount = 1; 

hret = m_pdirectdraw->createsu***ce( &ddsd, &m_pddsprimary, null ); 

//lock 

ddsu***cedesc2 ddsdprimary; 

ddsdprimary.dwsize = sizeof(ddsu***cedesc2); 

hres = m_pddsprimary->lock( null, &ddsdprimary, ddlock_wait, ddlock_nosyslock, 0 ); 

lpbyte lpbymemory = (lpbyte)ddsdprimary.lpsu***ce; 

// do some thing 

// unlock 

m_pddsprimary->unlock(null);

書上說,記憶體位址a000:0000到b000:0000為顯示儲存器,共128kb,c000:0000到ffff:ffff為各種bios用。有的書又說ega/vga卡中由256kb的動態儲存器(dram)組成,擴充套件的super vga顯示系統中,顯示儲存器大多超過256kb,高達512kb或1mb或更高。 

請問視訊記憶體到底在系統記憶體上還是顯示卡上,那大於128kb的顯存在哪兒,位址又是多少。windows下也把記憶體位址a000:0000到b000:0000為顯示儲存器嗎?

視訊記憶體當然是在顯示卡上了,為了能對現存進行操作,將系統的記憶體進行對映,所以寫到這些記憶體裡就象是寫到了視訊記憶體裡一樣,不同的顯示卡對映位址不一樣,與作業系統無關。

大於128kb的顯存在顯示卡上,位址還是使用a000:0000(dos下, windows 9x裡已經實現視訊記憶體動態定位了)至於如何切換需要操作顯示卡上的位遮蔽暫存器來實現,具體可是參考vesa標準. 

為了相容,windows當然要把a000:0000到b000:0000作為顯示儲存器位址之一

關於陣列位址問題

c語言中 指標 是算是比較難的乙個問題,而 指標 就是 位址 知道陣列的位址問題,才能在用指標陣列的時候得心應手。下面是一段 include int main int b 2 3 printf p t p n a,a 1 printf p t p n a,a 1 printf p t p n a 0...

GPU視訊記憶體未釋放問題

我們正在使用tensorflow或pytorch寫程式的時候,有時會在控制台將程式殺死,但是有時候程式已經結束了,用nvidia smi也看到程式已經停止,但是gpu還佔著記憶體沒有釋放。這是因為,在使用pytorch設定多執行緒 threads 進行資料讀取 data loader 時,其實是假的...

TensorFlow 2 X GPU視訊記憶體問題

tensorflow 2.x訓練時,預設狀態下gpu視訊記憶體只能分配82 左右 筆者電腦為rtx 2070 max q 8gb,windows 10,cuda 10.1,cudnn 7.6,tensorflow 2.1.0 很多部落格給出如下的 gpus tf.config.experimenta...