1.1 ROM存在的目的
Expansion ROM的存在主要是為了Device可以在boot過程中使用,因為在Boot過程中,OS還沒有裝載進Memory,所以就沒有可能把任何 driver從DISK拷貝進入Memory,所以devices在啟動過程中的enable和initialization都是通過 Expansion ROM裡的image來完成的。
1.2 Expansion ROM base address register
這個暫存器位於配置空間的offset 30H位置處。它就是用來反應Expansion ROM的一些資訊和資源需求的。
1.2.1 位址映射
通過這個暫存器來判斷確定塊容量和分配位址範圍。首先判斷映射類型(即需要資源是Memory? I/O?),此暫存器的bit 0為唯讀位,用來標示映射類型:0-->記憶體空間,1-->I/O位址空間。
* 記憶體基底位址暫存器:可以使32bits也可以是64bits的暫存器。其bit 1和bit 2的對應類型如下表:
位2和 位1 | 映射類型 |
00 | 基底位址暫存器為32位寬,可以在32位表示的記憶體位址範圍的任何地方進行映射 |
01 | 保留 |
10 | 基底位址暫存器為64位寬,可以映射到以64位表示的記憶體空間的任何地方 |
11 | 保留 |
至於bit 3,若資料是可預取的,就應將它設為1,否則清0。該暫存器的區域各位用來將一設備映射到記憶體空間。
基底位址暫存器中用於32位記憶體解碼器的bit【31::4】和用於64位記憶體解碼器的bit【63::4】稱為基底位址單元。它的作用是:確定與解碼器相關的記憶體的大小;給解碼器分配地址。如果記憶體設備需要小於4K的存儲空間,規範建議記憶體範圍強行設為4KB。
*I/O基底位址暫存器
映射到I/O空間的基址暫存器寬度只能是32bits的暫存器(why?因為I/O port就那一點)。
其中bit 0值為1(用硬體實現的),bit 1為保留位並且其讀出值必須為0,其餘各位用來把設備映射到I/O空間。
當基底位址暫存器bit 0的返回值為1時,表示這是一個I/O解碼器,而不是記憶體解碼器,bit 1保留並總是返回0,【31::2】是基底位址單元,並用於確定需要的I/O塊容量,設置它的起始位址。
1.2.2塊容量和分配位址範圍
要確定記憶體的容量或I/O空間大小可以通過簡單地向基底位址暫存器寫入全“1”並回讀來確定。若返回一個是0值,則表示未實現基底位址暫存器;如果讀回地值為非0,則編程人員通過從基底位址單元的最低有效位元向上掃描返回值以找到第一個被成功置“1”的bit來確定所需記憶體的容量或I/0空間的大小。假設暫存器的bit 0是一個加權二進位1,那麼bit 1的值就是2,bit 2的值就是4,依此類推。這樣,在基底位址單元中第一個發現的1所對應的加權二進位值便是所需的空間數。這也是暫存器的第一個可R/W bit,在它之上的所有位均定義為可R/W bit。這個資訊發現後,程式將32/64位元記憶體起始位址或32位I/O位址寫入基底位址暫存器中。
例如:寫入FFFFFFFFH,返回FFF00000H,這表明:
Bit 0=0,表示這是一個memory address decoder。
Bits[2:1]=00,表示可以映射到32bits 記憶體任意位置。
Bit 3=0,表明這不是一個可預取的memory。
Bit 20=1,表明bit 20是第一個值為1的bit。那麼它的權為:2的20次方=1 048 576,這是一個記憶體大小1MB的解碼器。
以上資料來自 老公公 百度空間
Peter Pan 修改整理.
作者已經移除這則留言。
回覆刪除您好 這個部份似乎是 base address register(BAR) 而非 EPROM
回覆刪除