日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

显存读写

發(fā)布時(shí)間:2023/12/18 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 显存读写 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ? 要在顯示屏顯示圖像,方法有兩種,mmio pio。現(xiàn)在的顯卡都應(yīng)當(dāng)支持vbe。

? ? ? ? ?vbe 提供了保護(hù)模式的接口,bios方式太舊了,且保護(hù)模式操作太復(fù)雜,故想找個(gè)簡(jiǎn)單的方式,但這方面的資料太少,花了不少時(shí)間,終于成功。

? ? ? ? ?利用bios 10號(hào)中斷取得保護(hù)接口信息,除5、7、9號(hào)程序,還有幾個(gè)端口信息,好不容易找到保護(hù)模式切換顯示模式的使用方法。不過還不確定bios返回端口的具體用途,但顯示設(shè)置的函數(shù)實(shí)驗(yàn)成功。

? ? ? ? 顯存的訪問,在低分辨率及字符模式,地址在0xa0000---0xbffff之間,但到了高分辨率就一般在高端內(nèi)存。網(wǎng)上查的說可以直接訪問,我怎么實(shí)驗(yàn)都沒成功。搞了一個(gè)星期,終于可以正確顯示。

? ? ? 要想訪問顯存,有3步:

? ? ?1. 顯存的物理地址,英文叫LFB,可以bios 1號(hào)中段獲取,資料上說可以自主設(shè)置,不過我在bochs上沒成功,不知哪里出錯(cuò)了,后來沒搞了。

? ? ? 2. MTRR,說起來有點(diǎn)復(fù)雜,意思就是把顯存地址注冊(cè)到地址空間。獨(dú)顯、核顯、仿真對(duì)地址分配有沒區(qū)別,還待實(shí)驗(yàn)。

? ? ? 3. 顯卡設(shè)置,開啟lfb。好象只能顯示真彩色,低色彩的還沒成功。

? ? 開啟之后,就顯存地址就是物理地址了,統(tǒng)一在4G之內(nèi),讀寫也正常,屏幕顯示正常,不過bochs顯示內(nèi)存指令不能顯示,不知道是bochs的問題,還是本來就這樣。關(guān)鍵代碼在下面

void BgaSetVideoMode(unsigned int Width, unsigned int Height, unsigned int BitDepth, int UseLinearFrameBuffer, int ClearVideoMemory)
{
?? ?// VBE disabling
? ? BgaWriteRegister(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_DISABLED);
?? ?//
? ? BgaWriteRegister(VBE_DISPI_INDEX_XRES, Width);
? ? BgaWriteRegister(VBE_DISPI_INDEX_YRES, Height);
? ? BgaWriteRegister(VBE_DISPI_INDEX_BPP, BitDepth);
? ? BgaWriteRegister(VBE_DISPI_INDEX_ENABLE, VBE_DISPI_ENABLED |
? ? ? ? (UseLinearFrameBuffer ? VBE_DISPI_LFB_ENABLED : 0) |
? ? ? ? (ClearVideoMemory ? 0 : VBE_DISPI_NOCLEARMEM));
}

?

DWORD find_empty_mtrr()
{
?? ?
?? ??? ?//RDMSR將64位由ECX寄存器指定的MSR(model specific register,
?? ??? ?//模式指定寄存器)的內(nèi)容讀出至寄存器EDX:EAX中
?? ??? ?//(在支持intel64架構(gòu)的處理器中RCX的高32位忽略)。
?? ??? ?//MSR的高32位內(nèi)容存放在EDX寄存器中,
?? ??? ?//MSR的低32位內(nèi)容存放在EAX寄存器中
?? ??? ?//(在支持intel64架構(gòu)的處理器中RDX和RAX的高32位忽略)。
?? ??? ?//如果MSR中沒有64位(有些位沒有實(shí)現(xiàn)),
?? ??? ?//則EDX:EAX中沒有實(shí)現(xiàn)的位置則未定義。
?? ??? ?//寄存器2個(gè)一組
?? ??? ?DWORD empmtrr,port,val1,val2;
?? ??? ?empmtrr=0;
?? ??? ?for (port=0x201;port<0x200+16;port=port+2)
?? ??? ?{
?? ??? ??? ?rdmsr(port,val1,val2);
?? ??? ??? ?if (!(val1&0x0800))
?? ??? ??? ?{
?? ??? ??? ??? ?port--;
?? ??? ??? ??? ?empmtrr=port;
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?return empmtrr;
}
void enableMtrr(DWORD addr)
{

?? ?DWORD mttr,val1,val2;
?? ?mttr = find_empty_mtrr();
?? ?// ; LFB , +8 M , write combine
?? ?//|64 保留 ? ?| 物理地址 12|11 ?8|7 type |0
?? ?//|64 保留 ? ?| 掩碼|Valid 11|10 保留 |0?? ?
?? ?wrmsr(mttr,addr | 1,0);
?? ?
? ? wrmsr(mttr+1,0xff800800,0xf);?
//?? ? enable mtrr's
? ? rdmsr(0x2ff,val1,val2); ?
?? ?wrmsr(0x2ff,val1 | 0x800 ,val2);
? ? ?
?? ??? ?
}

?

總結(jié)

以上是生活随笔為你收集整理的显存读写的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。