PCI总线的扩展ROM
' p$ M$ x B# A* e5 c$ ~! @
PCI总线规范中提供了一种机制,允许PCI设备携带一个与系统内存空间无关的扩展ROM,在其中存放一些信息和程序代码,以用于设备的初始化和系统的启动。这些程序代码还可以是几个,以适应不同的机制和处理器结构。扩展ROM中的代码从不在原地执行,而是将其从ROM中拷贝到RAM中,然后在RAM中执行。这样,可在初始化和运行时动态地确定代码长度,并且能提高代码的执行速度。
' a1 _8 ?6 U! H0 n) Q 为了适应不同的处理器系统,PcI设备的扩展ROM中可以包含多种处理器代码段,即扩展ROM中可以包含多个为不同的系统或处理器体系结构而设计的多个代码映像。每个映像必须开始于一个512字节边界并且必须含有PCI扩展。ROM头标。每一个映像的开始位置取决于前一个映像的长度。最后一个映像的头标中要有一个特殊编码,用来表示它是最后一个。
) q% U' R& z4 F' | 1.PCI扩展ROM的头标格式
M& C* C1 I8 P- n
每个ROM映像中所要求的信息分为两个不同的区域:一个区域为ROM头标,应放在ROM映像的开始处;另一个区域是PCI数据结构,必须放在映像的第一个64 KB中。
/ z+ a: ^, ~7 y) [6 ~$ j PCI扩展ROM头标格式如表9.7所示,其中的偏移量是从映像的开始处算起,并以16进制数表示,每个域的长度以字节为单位。ROM标签域的总长度为两个字节,第一字节的值为55H,第二字节为AAH。此标签在ROM的每个映像中部必须给出,并存放在各自ROM地址空间的前两个字节处。PCI数据结构指针的长度也是两个字节,用来指出PCI数据结构的起始偏移地址,而且,以ROM映像的起始位置为参考点。
/ V3 m1 Q$ N: g, B6 z
% c( c, e3 ~5 m% s F5 B: j
6 K+ t" d& P- b' J0 R! }
" b- n: ?% c* m" @; y4 j
* |; V( v3 u5 Y4 Z* }- r4 X
2 w( n3 _7 {& i" T I* r) m- u
需要指出,在PC-AT兼容的系统中对扩展ROM的头标进行了一些扩充,增加了两个域,一个位于偏移地址02H处,用来为映像提供初始化长度;另一个位于偏移地址03H处,是初始化程序(INIT功能)的入口点。
0 W0 Y6 R P; B/ m/ ?: S2.PCI数据结构格式
6 ^1 K- w5 E. U+ [% m
PCI数据结构必须放在ROM映像的前64 KB内,并且要做到按双字对齐,格式见表9.8。
1 j) M1 ^' T3 [9 z4 H" n8 x. o0 h* i3 @& y
# s/ n" E) {7 E) B: o4 C' ]; p
) V, T' D$ A. ]6 u7 ~# m
- }4 E4 i9 A6 Y 表中各个域的含义如下:
* q7 S/ ~0 Y* J1 j9 P0 k ①标签:用四个字节提供一个惟一的PCI数据结构标签“PCIR”。其中一个字符占一个字节,即“P”在偏移地址OH处,“C”在1H处,其余类推。
' J Y% o1 ]# j3 ^% [& r
②供应商识别码:一个16位长度的域,其内容与配置空间头标中的完全相同。
, w6 ~0 o% Q/ \
③设备识别:该域的长度为16位,其内容与配置空间头标中的完全相同。
5 L$ H7 W; B6 T F+ V$ S- q' o! H ④重要产品数据指针:该域的长度为16位,用以指出重要产品数据(VPD)的存放偏移地址。VPD必须放在ROM映像的前64 KB中。当该指针值为0时,表示ROM映像中没有VPD。关于VPD结构的具体内容有待定义。
( h: U5 I+ Q4 I ⑤PCI数据结构长度:一个16位长度的域,表示数据结构的长度,并且以字节为单位。
/ B2 e( R& g3 G- e" B' P
⑥PCI数据结构修改版:一个8位长度域,表示数据结构的修改版本号。
# I2 A$ M0 I* S4 h" h ⑦分类代码:该域的长度为24位,其内容与配置空间中的分类代码域相同。
! j7 h1 q2 U8 i3 ?
⑧映像长度:此域的长度为两个字节,用来表示映像的长度,并以512字节为单位。
7 b/ J7 |0 f! o, O9 C
⑨代码/数据版本:是一个2字节长的域,用来指出映像中代码的修改次数。
?& u% _& n }9 m9 c( t3 ^7 y
⑩代码类型:该域的长度为一个字节,用来表示ROM映像中的代码是什么类型。此代码为特定的处理器和系统体系结构而设置,可能是可执行的二进制代码,也可能是解释性代码。
& J* j" E) w) y7 P- m8 d ⑩指示标志:该域的长度为一个字节,其中的位7用来表示该映像是否是ROM中的最后一个。若该位为l,则表示该映像是最后一个映像;若为0,则表示后面还有映像。位6~位0为保留位。