1.Option ROM的背景知識
PCI Option ROM又叫PCI Expansion ROM。其位于PCI或者ISA設備上的只讀存儲器,因為這個存儲器不是總線標準規定一定要實現的,所以叫Option ROM(可選實現的ROM)。 它是用于設備初始化和系統boot的code,即存放著用于初始化該設備的數據和代碼。有的PCI Option ROM被存放在板卡上,而有的則保存在BIOS的binary里面。顯卡和網卡等設備上通常帶有Option ROM。
Option ROM按版本分有2.1的Option ROM和3.0的Option ROM。

如上圖所示,PCI Option ROM由image header, PCI data structure和Image 三個部分組成。
首先,在Option ROM的頭兩個字節是magic number: "0x55“,“0xAA"。由此可以驗證是否是合法的Option ROM.
其次,在0x18-0x19這個位置可以獲取到PCI Data structure pointer, 這其實是一個地址,由這個地址,我們可以得到PCI Data structure所存放的位置。
最后,通過解析PCI Data structure,我們可以獲得ROM的version, class type, size等等信息。
BIOS的Option ROM開發,有Legacy BIOS下的Option ROM,與UEFI的BIOS下Option ROM之分。由于PXE裝機只能在UEFI模式,故紫金的BIOS下Option ROM PXE和云盤啟動盤均是使用UEFI的BIOS下Option ROM調試。
2.UEFI的Option ROM結構

UEFI Option ROM利用了之前保留的字節(偏移0x04處),用來表明自己的身份。
UEFI Option ROM內的hex實際上是UEFI driver的一種,EDKII提供了相應的工具,將生成文件轉換為Option ROM。前面已經說過了,我們現在所開發的option ROM,主要是PCI Option ROM。關于PCI Option ROM的內容可以參考《EDKII Driver Writer’s Guide for UEFI 2.3.1》。
Option ROM文件,要求字節校驗和必須為0;Option ROM是由BIOS調用的。如果BIOS檢測到ROM代碼符合pnp BIOS的規范,將使用FAR CALL調用偏移3h處的入口向量,控制權將轉交給Option ROM代碼。當然,為了正常將控制權返回給BIOS,在Option ROM代碼的最后必須使用RETF,將控制權交出。因此,Option ROM第一件事情就是需要保存好各個寄存器的值,在執行完后還回去,防止BIOS罷工。
3.PCI配置空間關于Expansion ROM的定義
在pci/pcie設備的配置空間中關于Expansion ROM的定義在30h寄存器:

4.Expansion ROM 的初始化過程
BIOS的POST階段,掃描并執行pci設備的expansion的過程大概分以下幾步:
(1)首先判斷pci設備是否實現“Expansion rom base address”寄存器,有則進行下一步判斷;
(2)如果有實現了expansion的基址寄存器,則配置和使能expansion rom,然后查找expansion rom是否有”AA55”的標示字符,如果有則說明設備有真實的expansion rom芯片存在;
(3)如果expansion rom已經存在,則掃描是否有適合本設備和本CPU架構的image代碼存在;
(4)如果有適合本環境的image代碼存在,則把相應的代碼拷貝到ram的合適位置,并跳入header format中指定的初始化入口執行;
(5)最后關閉expansion rom的使能。