UNIQLOCK

2010年10月29日 星期五

PCI Expansion ROM(2)

這裡主要寫對ROM shadowing RequiredROM content
Expansion ROM2
2.1 ROM Shadowing Required
why ROM為什麼需要映射?它又被映射到什麼地方呢?
      PCI SPEC中要求device's expansion rom code 是不能夠在它自己的ROM裡執行的,它必須被copyRAM中去執行。這樣做的原因是:
& ROM的訪問效率是很慢的,無論何時從ROM中去指令執行性能都是很長的。
& 一旦在ROM中的driver 初始化部分已經被執行(在ram中),它可能被丟棄(比如init code copy),在ram中的code image 能夠變小,使RAM中只存在需要的code。這樣執行剩下的code 效率更高。
    一旦device rom被檢查存在,這個配置軟體就copy code image main memory並且disabled rom address decoder(把Expansion rom base address register bit 0 設為0)。在非pc環境中copycode 可能在記憶體中的任何位置。
         pc環境中,則ROM CODE image 必須被拷貝到規定的device ROMS 位址範圍:000C0000H---000DFFFFH,如果在class code(見配置空間暫存器對其描述)指明四個VGA’s device rom, 那麼它的code image必須拷貝進開始位址:000C0000h
  
哪一個image需要copy?這就要瞭解下ROM content的結構了
  
2.2 ROM Content
    2.2.1概述
   PCI Device ROM中可以包含超過一個code image(如圖 2.1),一個ROM包含適合各種廠家的device各種各樣的code image。所以被copy進主存的image 必須匹配這個function ID. 所以每個code image 包含:
-Vendor ID Device ID
-Class code。這個主要是對class device ,具體參考class code register

2.1 Multiple code images contain in one device ROM
          每一個image都是開始於一個512位元組邊界並且包含有PCI擴展ROM頭標,其開始位置決定於前一個image的長度。最後一個image在其頭標中需要標明(在位於擴展ROM data structure offset 14H的一個byte,其bit 0-bit 6 保留即全為0bit 7=1-->last imagebit 7=0-->not last image。)。
           
每一個ROM映射中所要求的資訊分為四個不同的區域:一個區域是ROM頭標,應該放在ROM映射的開始處;二個區域是PCI資料結構,必須放置在映射的第一個64KB處(為啥是64K呢?清注意頭標區 offsetPCI資料結構指標,是一個2bytes 16bits的指標-->即最大offset 64K)。圖2.2表示了擴展ROM中一個映射的典型佈局。三個是Runtime code,四個是initialization code

2.2 ROM IMAGE的典型佈局




2.     ROM頭標
ROM頭標格式如下:

ROM標識為55H 0AAHPOST程式在檢測ROM開頭兩個位元組,只要檢測到55 AA就知道知道有擴展ROM了。加電自檢程式(POST)當檢測到合適的ROM後,會直接調用偏移+3處的指令,故在此位置上(偏移+3處)總是放置一個跳轉指令。
3.     PCI資料結構
PCI資料結構格式如下:

供應商識別碼和設備識別碼必須和PCI配置空間中的相應欄位一樣,否則也不會執行映射中指令的。設備分類代碼雖然也要和PCI配置空間中資料一致,但是POST不會進行強行檢測,也就是說:這不是ROM映射是否執行的必須條件。POST主要根據該欄位(55AA)來判斷設備類型,以進行一些特別處理,例如,當為VGA設備時,POST就會將ROM 中的BIOS拷貝至RAM0C0000H處。

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

沒有留言:

張貼留言