UNIQLOCK

2010年10月29日 星期五

PCI Expansion ROM(3)


Execution of initialization code
在大多數情況下,系統的上電自測試(POST)程式碼對插接的PCI設備的處理與對那些焊接在母板上的設備的處理相同。但對Expansion ROM的處理是不同的。POST程式碼分兩步檢測一個選項ROM是否存在:其中第一步確定設備是否在配置空間中實現了一個Expansion ROM基底位址暫存器,如果該暫存器存在,POST就必須將ROM映射到位址空間中未用的部分並將使能位置1;第二步是檢查前兩個位元組是否為標籤值AA55H,如果是,就表示存在一個ROM,否則就說明該設備上沒有ROM
     如果檢測到設備上有一個ROMPOST就必須在該ROM中尋找一個具有合適的程式碼類型的映射,同時該映射中的供應商識別和設備識別欄位也要與設備配置空間的相應欄位吻合。當這個合適的映射找到之後,POST就從ROM中拷貝適當數量的資料到RAM中,然後執行該設備的初時化程式碼。至於拷貝多少資料量,以及怎樣執行設備初始化程式碼,要由程式碼類型來決定。
系統中的POST程式碼根據初始化長度欄位所指定的位元組數,將資料從ROM拷貝到RAM中,然後以03H處的值作為入口點調用INIT功能。在INIT返回之前,POST程式碼應將上述拷貝過來的RAM區保持為可寫狀態,以使INIT程式碼能在該區存放一些靜態資料,並調整運行存儲分配,使得系統在運行時耗費較少的空間。
當涉及到Expansion ROM時,在系統POST程式碼中有一套為PC相容而設的特別步驟,它們是:
1.       映射並使能Expansion ROM到記憶體位址空間的一個空區域。
2.       ROM中尋找一個適當的映射區,並根據初始化長度指定的位元組數從ROM中拷貝資料到RAM相容區。
3.       使Expansion ROM基底位址暫存器失效。
4.       保持RAM區為可寫狀態並遠端調用(FAR CALLINIT功能。
5.       INIT返回之後,利用偏移位址02H處的值決定運行時需要多少記憶體空間。
在系統引導之前,POST程式碼必須把含有Expansion ROM程式碼的RAM區變為唯讀區。
POST程式碼必須用特殊的方法去處理帶有Expansion ROMVGA設備,VGA設備的Expansion BIOS必須拷貝到0C0000H處。VGA設備的識別是通過檢查設備配置空間中的分類程式碼欄位來實現的。
6.        ROM的初始化(INIT)程式碼
PC相容的Expansion ROM中,含有一個INIT功能,用來負責I/O設備的初始化以及為運行操作做準備。由於在執行INIT功能時程式碼所駐留的RAM區被保持為可寫狀態,因此,允許PCI-Expansion ROM中的INIT功能具有某種Expansion 能力。
INIT功能執行期間,INIT功能可以在它的RAM區中存放靜態參數。運行BIOS或設備驅動程式便可以調用這些參數。但是該RAM區在運行期間是不能寫入的。
INIT功能還可以調整它在運行期間所消耗的RAM總量,具體方法是修改映像中位於偏移位址02H處的長度欄位,從而能夠保持Expansion ROM區(0C0000H~0DFFFFH)佔用有限的記憶體資源。例如,一個設備的Expansion ROM為其初始化和運行程式碼要求24KB的存儲空間,但運行程式碼只要求8KBROM中的映像所表現出的長度是24KB。所以,POST程式碼將全部資料拷貝到RAM中。然後,當運行到INIT功能時,它可以調整長度欄位使其減為8KB。當退出INIT功能時,POST程式碼看到的運行長度為8KB並且可以將下一個Expansion BIOS拷貝到最佳位置。
INIT功能負責保證整個映像長度的檢查的校驗和是正確的。如果它以任何方式修改了RAM區,就必須計算出新的校驗並存入映像中。INIT功能不能以任何方式修改系統記憶體(除RAM區域的INIT功能),除非它對配置記憶體採用適當的協定或BIOS服務。
如果要將INIT功能從Expansion ROM中移去,只要向初始化長度欄位(偏移位址02H)寫入0即可。在這種情況下,不產生檢查。
    INIT從入口處可以得到三個參數:設備的匯流排編號(Bus)、設備編號(Device)和功能編號(Function)。這些參數可以用來訪問正在被初始化的設備。它們被傳送到X86的寄存器AX中,其中AH包含匯流排編號,AL的高5位元為設備編號,AL的低3位元是功能編號。
    映射結構的三個長度:
一個PC相容的映射有三個長度與映射結構有關:映射長度、初始化長度和運行長度。
映射長度是映射的總長度,它必須大於或等於初始化長度。
初始化長度表示映射中所含的初始化程式碼和運行程式碼兩部分的總和,這也是在執行初始化例行程式之前,POST程式碼要拷貝到RAM區中的資料總量。初始化長度必須大於或等於運行長度。拷貝到RAM區中的初始化資料的檢查和必須為0
運行長度是指映射中所包含運行程式碼的總量。這也是系統運行時POST程式碼保留在RAM區中的資料量。這部分映射的檢查和必須為0.
PCI資料結構必須包含與映射的運行分配部分中,否則他必須包含於初始化部分


以上資料來自 老公公  百度空間
Peter Pan 修改整理.

沒有留言:

張貼留言