?? vesa編程介紹2.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0077)http://shaker.myrice.com/document/vesa-program-introduce/vesa-introduce-2.htm -->
<HTML><HEAD><TITLE>VESA編程介紹</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2800.1276" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId></HEAD>
<BODY>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%">===========================================================================================</P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
size=4>VESA <FONT lang=ZH-CN face=宋體>編程介紹
(2):</FONT></FONT><FONT size=3>CPU<FONT lang=ZH-CN>顯存控制</FONT></FONT> <FONT
lang=ZH-CN face=宋體 size=4> </FONT><FONT size=2> </FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%">-------------------------------------------------------------------------------------------</P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
size=2> 相關章節: <A
href="http://shaker.myrice.com/document/vesa-program-introduce/vesa-introduce-1.htm">(1):
標準VGA BIOS及超級VGA模式號</A> (2):CPU<FONT
lang=ZH-CN>顯存控制 </FONT><A
href="http://shaker.myrice.com/document/vesa-program-introduce/vesa-introduce-3.htm"><FONT
lang=ZH-CN>(3)</FONT>:<FONT lang=ZH-CN>擴展的VGA BIOS</FONT></A></FONT> </P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"> <FONT
lang=ZH-CN size=2> <A
href="http://shaker.myrice.com/document/vesa-program-introduce/vesa-introduce-4.htm">(4):
擴展的VGA BIOS(續)及應用舉例</A></FONT> </P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%">-------------------------------------------------------------------------------------------</P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>5、CPU顯存窗口</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體
size=2>標準的VGA系統提供256K字節內存和相應的尋址方式。超級VGA及其顯示模式需要多于標準的256K的內存,但由于兼容性問題,該內存地址空間必須被限制為標準地址空間。CPU顯存窗口提供了通過標準CPU地址空間來訪問擴展VGA內存的方法。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>本章講述了幾種硬件實現CPU顯存窗口的過程,它們對軟件設計的影響,并聯系VESA VGA BIOS擴展舉例。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>VESA
CPU顯存窗口將不追求形式的、非標準的硬件函數放入BIOS,而將要求形式的、標準的硬件函數放入程序。這就提供了VGA系統直接訪問硬件所帶來的輕便和高效性。比如,VESA
BIOS負責將顯存映射為CPU地址空間,而程序則負責實際內存的讀寫操作。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體
size=2>這一軟硬件組合的接口是通過將參數通知程序來控制硬件機構將顯存映射為CPU地址空間并通過這些參數來讓程序控制映射的過程來完成的。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>5-1、硬件設計的考慮</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>5-1-1、受限于CPU 64K/128K的地址空間</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>為了實現顯存的擴展,首先想到的是將訪問權交給應用程序。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體
size=2>典型的標準16色VGA圖形模式的CPU地址空間是從段A000h開始的64K。如果每平面是64K的話,就能訪問256K的標準VGA空間了。對擴展顯存的訪問通過將顯存的一部分映射為標準VGA
CPU地址空間來完成。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體
size=2>每一個超級VGA硬件設備都能讓程序指定從顯存的哪里開始將顯存映射為CPU地址空間。并提供對映射內存的讀寫能力,從而也使程序獲得了在硬件級操縱顯存的能力。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>5-1-2、跨越CPU顯存窗口界限</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體
size=2>大多數的對視頻進行操作的程序的算法中都有一對嵌套循環:外循環沿著行或掃描線而內循環垂直于行或掃描線。這個內循環正是公認的程序性能的瓶頸。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體
size=2>如果有一個很大的矩形,其位置又很糟糕,所需內存的一部分可能被顯存映射到CPU地址空間,而另一部分則可能必須改變映射方式才能由CPU訪問到。最好是將顯存的重映射放在內循環的外面。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體
size=2>典型的做法是選擇顯存的某一偏移地址進行映射作為CPU地址空間的開始,這樣就能確定至少有一個完整的行或掃描線能在不重新映射的情況下被CPU訪問。現在沒有哪個超級VGA能夠允許由8位邊界來指定偏移量,而且各種超級VGA之間將所要的顯存作為CPU地址空間的開始的能力也相去甚遠。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體
size=2>顯存中能被定位在任何CPU地址空間的最近的兩個字節之間的字節數被定義為窗口函數的間隔尺寸。一些超級VGA系統能允許任意的4K顯存區域映射到CPU地址空間的開始,而另一些超級VGA系統能允許任意的64K顯存區域映射到CPU地址空間的開始。這是兩個間隔尺寸為4K和6K的例子。這個概念很類似與INTEL
16位CPU訪問字節時首先要將段寄存器改變(這里段寄存器或稱映射的間隔尺度是16位的)。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>注釋:</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體
size=2>如果間隔尺度同CPU地址空間相同,比如說顯存映射函數的最小位數大于CPU地址空間的最大位數,那么內循環將不得不包含一個是否越出CPU地址空間的測試。這是因為如果CPU地址空間(這里即是間隔尺寸)的大小不能被掃描線長度所整除,那么地址空間中最后的掃描線將處于不同的顯存而不能同時被映射到CPU地址空間。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>5-1-3、處理來自不同區域的數據</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face="Times New Roman" size=3></FONT><FONT face=宋體
size=2>有時候,將來自顯存兩個區域的內容移動或合并是很有必要也是很方便的。舉例來說,可以在顯存中跨過以顯示的內存來存儲菜單,因為所有的VGA都有硬件支持通過8位的CPU讀寫來傳送32位的視頻數據。如果原始資料位置和目標位置之間的距離大于CPU顯存窗口的大小,則必須開設兩個獨立的可映射的CPU顯存窗口。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>5-1-4、將來自不同窗口的數據結合</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體
size=2>上面的將一個CPU顯存窗口的數據移到另一個CPU顯存窗口的例子只需要對一個CPU顯存窗口進行讀操作,而對另一個進行寫操作。有時候需要對兩個窗口讀操作,而對一個窗口進行寫操作。比如說,光柵操作將數據和原始資料邏輯合并作為結果輸出。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>5-2、硬件窗口的不同類型</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>不同的CPU顯存窗口的硬件實現都能被VESA
BIOS擴展所支持。程序了解硬件類型所需的信息由BIOS提供。有三種基本的硬件窗口的實現,下面詳細討論。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>下面涉及的窗口方案并不包括間隔尺寸的不同。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>同時請記住VGA能使用的CPU地址空間是從A000h開始的128K字節。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>5-2-1、單窗口系統</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體
size=2>一些硬件設備只提供一個窗口。該窗口能被讀出也能被寫入。但是如果要在顯存中大于CPU地址空間的距離間移動數據將造成性能的嚴重降低。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>5-2-2、雙重窗口系統</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>許多超級VGA提供雙窗口以便在顯存內移動數據。有兩鐘不同的方法提供雙窗口。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>5-2-2-1、重疊窗口</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體
size=2>一些硬件設備通過判別CPU對內存進行讀或寫操作來區分窗口A和窗口B。當兩個窗口由CPU打算進行的讀或寫操作區分時,它們通常共享CPU地址空間。但一個窗口為只讀,而另一個窗口為只寫。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>5-2-2-2、非重疊窗口</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋體 size=2>雙窗口系統區分窗口A和窗口B的另一個方法是通過查看CPU地址在總的VGA
CPU地址空間中的位置。兩者不能共享CPU地址空間,但卻都可以進行讀寫操作。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"> </P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><End></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%">--------------------------------------------------------------------------------------------</P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
size=2>相關章節: </FONT><A
href="http://shaker.myrice.com/document/vesa-program-introduce/vesa-introduce-1.htm"><FONT
size=2>(1): 標準<FONT face="Times New Roman">VGA BIOS</FONT>及超級<FONT
face="Times New Roman">VGA</FONT>模式號</FONT></A><FONT
size=2> <FONT
face="Times New Roman">(2)</FONT>:CPU<FONT lang=ZH-CN>顯存控制
</FONT><A
href="http://shaker.myrice.com/document/vesa-program-introduce/vesa-introduce-3.htm"><FONT
lang=ZH-CN face="Times New Roman">(3)</FONT><FONT lang=ZH-CN>擴展的</FONT><FONT
lang=ZH-CN face="Times New Roman">VGA BIOS</FONT></A></FONT> <FONT lang=ZH-CN
face="Times New Roman" size=2> </FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
lang=ZH-CN face="Times New Roman"
size=2> <A
href="http://shaker.myrice.com/document/vesa-program-introduce/vesa-introduce-4.htm">(4):
</A></FONT><A
href="http://shaker.myrice.com/document/vesa-program-introduce/vesa-introduce-4.htm"><FONT
lang=ZH-CN size=2>擴展的</FONT><FONT lang=ZH-CN face="Times New Roman" size=2>VGA
BIOS(</FONT><FONT lang=ZH-CN size=2>續</FONT><FONT lang=ZH-CN
face="Times New Roman" size=2>)</FONT><FONT lang=ZH-CN size=2>及應用舉例</FONT></A>
</P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%">============================================================================================</P></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -