VESA編程介紹???? (2):CPU顯存控制???
---------------------------------------------------------------------------------
相關(guān)章節(jié):??
(1): 標(biāo)準(zhǔn)VGA BIOS及超級(jí)VGA模式號(hào)
(2):CPU顯存控制???? ?
(3):擴(kuò)展的VGA BIOS
(4): 擴(kuò)展的VGA BIOS(續(xù))及應(yīng)用舉例
---------------------------------------------------------------------------------
5、CPU顯存窗口
標(biāo)準(zhǔn)的VGA系統(tǒng)提供256K字節(jié)內(nèi)存和相應(yīng)的尋址方式。超級(jí)VGA及其顯示模式需要多于標(biāo)準(zhǔn)的256K的內(nèi)存,但由于兼容性問題,該內(nèi)存地址空間必須被限制為標(biāo)準(zhǔn)地址空間。CPU顯存窗口提供了通過標(biāo)準(zhǔn)CPU地址空間來訪問擴(kuò)展VGA內(nèi)存的方法。
本章講述了幾種硬件實(shí)現(xiàn)CPU顯存窗口的過程,它們對軟件設(shè)計(jì)的影響,并聯(lián)系VESA VGA BIOS擴(kuò)展舉例。
VESA CPU顯存窗口將不追求形式的、非標(biāo)準(zhǔn)的硬件函數(shù)放入BIOS,而將要求形式的、標(biāo)準(zhǔn)的硬件函數(shù)放入程序。這就提供了VGA系統(tǒng)直接訪問硬件所帶來的輕便和高效性。比如,VESA BIOS負(fù)責(zé)將顯存映射為CPU地址空間,而程序則負(fù)責(zé)實(shí)際內(nèi)存的讀寫操作。
這一軟硬件組合的接口是通過將參數(shù)通知程序來控制硬件機(jī)構(gòu)將顯存映射為CPU地址空間并通過這些參數(shù)來讓程序控制映射的過程來完成的。
5-1、硬件設(shè)計(jì)的考慮
5-1-1、受限于CPU 64K/128K的地址空間
為了實(shí)現(xiàn)顯存的擴(kuò)展,首先想到的是將訪問權(quán)交給應(yīng)用程序。
典型的標(biāo)準(zhǔn)16色VGA圖形模式的CPU地址空間是從段A000h開始的64K。如果每平面是64K的話,就能訪問256K的標(biāo)準(zhǔn)VGA空間了。對擴(kuò)展顯存的訪問通過將顯存的一部分映射為標(biāo)準(zhǔn)VGA CPU地址空間來完成。
每一個(gè)超級(jí)VGA硬件設(shè)備都能讓程序指定從顯存的哪里開始將顯存映射為CPU地址空間。并提供對映射內(nèi)存的讀寫能力,從而也使程序獲得了在硬件級(jí)操縱顯存的能力。
5-1-2、跨越CPU顯存窗口界限
大多數(shù)的對視頻進(jìn)行操作的程序的算法中都有一對嵌套循環(huán):外循環(huán)沿著行或掃描線而內(nèi)循環(huán)垂直于行或掃描線。這個(gè)內(nèi)循環(huán)正是公認(rèn)的程序性能的瓶頸。
如果有一個(gè)很大的矩形,其位置又很糟糕,所需內(nèi)存的一部分可能被顯存映射到CPU地址空間,而另一部分則可能必須改變映射方式才能由CPU訪問到。最好是將顯存的重映射放在內(nèi)循環(huán)的外面。
典型的做法是選擇顯存的某一偏移地址進(jìn)行映射作為CPU地址空間的開始,這樣就能確定至少有一個(gè)完整的行或掃描線能在不重新映射的情況下被CPU訪問?,F(xiàn)在沒有哪個(gè)超級(jí)VGA能夠允許由8位邊界來指定偏移量,而且各種超級(jí)VGA之間將所要的顯存作為CPU地址空間的開始的能力也相去甚遠(yuǎn)。
顯存中能被定位在任何CPU地址空間的最近的兩個(gè)字節(jié)之間的字節(jié)數(shù)被定義為窗口函數(shù)的間隔尺寸。一些超級(jí)VGA系統(tǒng)能允許任意的4K顯存區(qū)域映射到CPU地址空間的開始,而另一些超級(jí)VGA系統(tǒng)能允許任意的64K顯存區(qū)域映射到CPU地址空間的開始。這是兩個(gè)間隔尺寸為4K和6K的例子。這個(gè)概念很類似與INTEL
16位CPU訪問字節(jié)時(shí)首先要將段寄存器改變(這里段寄存器或稱映射的間隔尺度是16位的)。
注釋:
如果間隔尺度同CPU地址空間相同,比如說顯存映射函數(shù)的最小位數(shù)大于CPU地址空間的最大位數(shù),那么內(nèi)循環(huán)將不得不包含一個(gè)是否越出CPU地址空間的測試。這是因?yàn)槿绻鸆PU地址空間(這里即是間隔尺寸)的大小不能被掃描線長度所整除,那么地址空間中最后的掃描線將處于不同的顯存而不能同時(shí)被映射到CPU地址空間。
5-1-3、處理來自不同區(qū)域的數(shù)據(jù)
有時(shí)候,將來自顯存兩個(gè)區(qū)域的內(nèi)容移動(dòng)或合并是很有必要也是很方便的。舉例來說,可以在顯存中跨過以顯示的內(nèi)存來存儲(chǔ)菜單,因?yàn)樗械腣GA都有硬件支持通過8位的CPU讀寫來傳送32位的視頻數(shù)據(jù)。如果原始資料位置和目標(biāo)位置之間的距離大于CPU顯存窗口的大小,則必須開設(shè)兩個(gè)獨(dú)立的可映射的CPU顯存窗口。
5-1-4、將來自不同窗口的數(shù)據(jù)結(jié)合
上面的將一個(gè)CPU顯存窗口的數(shù)據(jù)移到另一個(gè)CPU顯存窗口的例子只需要對一個(gè)CPU顯存窗口進(jìn)行讀操作,而對另一個(gè)進(jìn)行寫操作。有時(shí)候需要對兩個(gè)窗口讀操作,而對一個(gè)窗口進(jìn)行寫操作。比如說,光柵操作將數(shù)據(jù)和原始資料邏輯合并作為結(jié)果輸出。
5-2、硬件窗口的不同類型
不同的CPU顯存窗口的硬件實(shí)現(xiàn)都能被VESA BIOS擴(kuò)展所支持。程序了解硬件類型所需的信息由BIOS提供。有三種基本的硬件窗口的實(shí)現(xiàn),下面詳細(xì)討論。
下面涉及的窗口方案并不包括間隔尺寸的不同。
同時(shí)請記住VGA能使用的CPU地址空間是從A000h開始的128K字節(jié)。
5-2-1、單窗口系統(tǒng)
一些硬件設(shè)備只提供一個(gè)窗口。該窗口能被讀出也能被寫入。但是如果要在顯存中大于CPU地址空間的距離間移動(dòng)數(shù)據(jù)將造成性能的嚴(yán)重降低。
5-2-2、雙重窗口系統(tǒng)
許多超級(jí)VGA提供雙窗口以便在顯存內(nèi)移動(dòng)數(shù)據(jù)。有兩鐘不同的方法提供雙窗口。
5-2-2-1、重疊窗口
一些硬件設(shè)備通過判別CPU對內(nèi)存進(jìn)行讀或?qū)懖僮鱽韰^(qū)分窗口A和窗口B。當(dāng)兩個(gè)窗口由CPU打算進(jìn)行的讀或?qū)懖僮鲄^(qū)分時(shí),它們通常共享CPU地址空間。但一個(gè)窗口為只讀,而另一個(gè)窗口為只寫。
5-2-2-2、非重疊窗口
雙窗口系統(tǒng)區(qū)分窗口A和窗口B的另一個(gè)方法是通過查看CPU地址在總的VGA CPU地址空間中的位置。兩者不能共享CPU地址空間,但卻都可以進(jìn)行讀寫操作。
<End>