(简介)PCI Extension ROM
PCI Spec 2.2
很多PCI设备都带有自己的ROM(比如网卡,显卡),里面存放着设备的特有初始化代码(代码类型有可执行的和解释型的,俗称BIOS),并且这个ROM是和主芯片分离的。
当系统BIOS做POST时,会检测各个PCI设备的头部结构中的Extension ROM BAR寄存器,如果实现了这个寄存器(bit0为1)就表示该设备包含Extension ROM,需要做设备特有的初始化。通过往这个寄存器写全1的数,然后再读出来得到一个mask,此mask表示需要为ROM提供多大的映射内存地址空间。
Extension ROM存放的是多个image,每个image的功能一般是一样的,但是它们的内容格式确是不同的,多个image是为了要支持不同的体系结构,各个image由image头部中的vendorID和deviceID识别。每个image的头2个字节固定为0xAA55,用于定位ROM的位置。
ROM内容的格式主要有:PC/AT, Open Firmware Spec, HP Spec。当前比较常用的是PC/AT。
对于PC/AT格式,第2个字节表示image有多少个512字节是有用的初始化代码(即需要搬运到RAM的代码大小),第3,4个字节是一个指向INIT entry的偏移指针,程序最后通过这个指针跳到ROM的初始化代码处去执行。
很多PCI设备都带有自己的ROM(比如网卡,显卡),里面存放着设备的特有初始化代码(代码类型有可执行的和解释型的,俗称BIOS),并且这个ROM是和主芯片分离的。
当系统BIOS做POST时,会检测各个PCI设备的头部结构中的Extension ROM BAR寄存器,如果实现了这个寄存器(bit0为1)就表示该设备包含Extension ROM,需要做设备特有的初始化。通过往这个寄存器写全1的数,然后再读出来得到一个mask,此mask表示需要为ROM提供多大的映射内存地址空间。
Extension ROM存放的是多个image,每个image的功能一般是一样的,但是它们的内容格式确是不同的,多个image是为了要支持不同的体系结构,各个image由image头部中的vendorID和deviceID识别。每个image的头2个字节固定为0xAA55,用于定位ROM的位置。
ROM内容的格式主要有:PC/AT, Open Firmware Spec, HP Spec。当前比较常用的是PC/AT。
对于PC/AT格式,第2个字节表示image有多少个512字节是有用的初始化代码(即需要搬运到RAM的代码大小),第3,4个字节是一个指向INIT entry的偏移指针,程序最后通过这个指针跳到ROM的初始化代码处去执行。


At 11:13 AM,
xiayubin said…
如果ROM为解释性的代码是否就不存在体系结构依赖的问题?
PS:有错别字哦:)
At 11:48 AM,
Andy Yang said…
Brady学会我的偏执了,哈哈……
At 8:55 PM,
water said…
又读了一遍,没错呀。难道是已经被改了?
At 8:58 PM,
water said…
之前说过的FCode的代码(Open Firmware Spec)就是一种体系结构无关的代码。
At 9:04 PM,
Andy Yang said…
FCode怎么执行呢?解释?
这不有是VMM吗?哈哈:)
At 4:12 PM,
water said…
FCODE的二进制代码由BIOS中的解释器解释执行,是有点虚拟机的概念。
Post a Comment