PCIe Expansion Roms

PCIe Expansion ROMs

1. 爲什麼需要Expansion ROM

爲了將操作系統加載到內存中,系統需要三類設備:

  • 存儲設備:用於保存操作系統。
  • 顯示設備:用於顯示當前的啓動進度。
  • 輸入設備:用於接收用戶輸入信息。

在這個階段,操作系統還沒有被加載到內存執行,也就意味着操作系統中對應的設備驅動程序也沒有被加載,因此,就需要在Expansion ROM裏面存放一份啓動階段使用的設備驅動程序。

說的直接點就是,BIOS階段向使用一個PCIe設備,但是原始的BIOS不包含這個設備的驅動程序,這個時候就從這個PCIe設備Expansion ROM裏獲取設備驅動程序代碼,並加載到內存中執行。

2. 怎麼知道PCIe設備是否包含Expansion ROM

並不是所有PCIe設備都包含Expansion ROM,所以就需要軟件進行判定。

在PCIe的配置空間(PCIe Configuration Space)裏有個叫“Expansion ROM Base Address Register”的東西,利用它判定Expansion ROM的步驟如下:

  • 向Expansion ROM Base Address Register寫入0xFFFF FFFF。
  • 讀取Expansion ROM Base Address Register,如果值是0,那就表示不存在Expansion ROM(Game Over!)。如果讀取的值非0,那就表示存在Expansion ROM,但這並不就表明這東西可用了,還需要下面的判定步驟。
  • 給PCIe Expansion ROM分配一個合適的地址,把地址的值寫入Expansion ROM Base Address Register。
  • 將Expansion ROM Base Address Register bit 0置爲1,使能Address Decode。
  • 讀取ROM的前兩個字節,如果前兩個字節是AA55h,那就表明當前ROM是合法可用的,否則還是Game Over

3. 怎麼知道Expansion ROM的空間大小

在Expansion ROM的判定階段,有一個過程是向Expansion ROM Base Address Register寫入0xFFFF FFFF,然後讀取它的值,利用這個值就可以判定出Expansion ROM的空間大小。

假設寫入0xFFFF FFFF之後,讀出的值是0xFFFE 0000,那麼第17位就是非0值的最低位,那麼Expansion ROM的大小就是2^17 Bytes= 128KB。PCI文檔規定,ROM最大可爲16MB,即bit[31:25]必須是可讀/可寫的。

4. Expansion ROM裏存了什麼

4.1 不只一份Code Image

就像之前提到的,ROM存了設備的驅動程序代碼,專業點叫做code image。實際上,PCI協議規定ROM裏可以存放不只一份code image,不同的code image對應不同的處理器架構同一供應商的不同產品等等。BIOS或者其他軟件需要選擇最合適的code image提取到內存中執行。

每一份code image包含run-time code image和initialization code image兩部分。BIOS或其他上位機軟件按照如下步驟使用code image:

  • 將最合適的code image拷貝的內存中。
  • 將Expansion ROM Base Address Register bit 0置爲0,關閉Expansion ROM’s address decoder。
  • 執行initialization code。
  • 釋放initialization code所佔用的內存。
  • 將剩餘的code image所佔用的內存部分設置爲寫保護(write-protected),避免被修改。

4.2 Code Image格式

在這裏插入圖片描述

4.2.1 Header Format

在每個image最開始的地方都有一個Header,因此可以叫它code image header。

下面的表格描述了code image header的格式(第一列的offset是指相對於該image起始位置的偏移):
在這裏插入圖片描述
Offset 02h~17h的位置存放的是處理器相關的數據,其格式如下表:
在這裏插入圖片描述

4.2.2 Data Structure Format

Data structure中包含了設備信息和image信息。

由於code image header中使用兩個bytes存放指向data structure的指針,所以data structure只能存放在該code image的前64KB範圍內。

當code image中包含run-time code時,data structure必須放在run-time code中。但是在某些情況下,code image可以不包含run-time image,只有initialization code,此時data structure放在initialization code中。

Data Structure格式如下表:
在這裏插入圖片描述

  • Vendor ID & Device ID & Class Code :只有當這三個參數與設備匹配時,該image纔會被BIOS加載到內存中執行。
  • Code Type:表明當前image的執行條件。
    • Code Type = 00h:Intel x86 (兼容IBM PC-AT)架構可執行代碼。
    • Code Type = 01h:符合open firmware標準,可結合OpenBoot使用。
    • Code Type = 02h:HP PA/RISC架構可執行代碼。
    • Code Type = 03h:Extensible Firmware Interface(EFI)

參考資料:《PCI Express System Architecture》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章