分类:
2010-09-07 22:00:58
通过执行INT 1AH指令可以调用16位的PCI BIOS,也可以直接在物理寄存器位置000FFE6EH调用PCI BIOS。32位BIOS的调用要通过一个远程调用来实现。在这两种情况下,调用这都必须首先将需要的请求参数装入处理器的寄存器组。在入口AH寄存器必 须包含PCI的功能ID:B1H,AL寄存器必须包含PCI下级功能识别器。
1、PCI BIOS的存在性
入口参数:
AH=B1H
AL=01H
出口参数:
EDX:返回值为“PCI”。字符“P”存放在DL;字符“C”存放在DH;字符“I”存放在EL;EH中方一个空格符
AH:存在状态。如果EDX设置适当,则00H表示存在PCI BIOS。
AL:硬件机制
BL:接口版本
CL:系统中最后一个PCI局部中线的号码
CF:状态标志。为1表示没有PCI BIOS,为0表示存在PCI BIOS。
如果CF被清除且AH的内容为00H时,为了确定PCI功能设置的有效性,对EDX内容的检查仍然是必须的。BX进一步指出版本号,版本号以BCD码形式存在。如v2.10,BH将返回02H,BL将返回10H。
AL的返回值标识与访问配置空间和产生PCI特殊周期相关的支持平台的特定硬件字符。PCI规范为访问配置空间定义了两种硬件机制,AL返回值的位0与位 1表示当前平台支持那种机制。位0等于1时支持1#机制,位1等于1时表示支持2#机制,位2、3、6、7是保留位,返回值必须是0。
PCI规范中也为特殊周期的产生定义了硬件机制,AL的返回值的位4、5两位指出机制类型。位4为1表示支持基于1#配置机制的特殊周期产生;位5为1表示支持基于2#配置机制的特殊周期产生。
CL的返回值表示系统中最后一个PCI局部总线的号码,PCI局部中线的号码从0开始,到CL中的返回值为止。
2、PCI设备检测
入口参数:
AH=B1H
AL=02H
CX=设备识别号,从0~~65535
DX=供应商识别代码,从0~~65534
SI=索引号,0~~N
出口参数:
BH=总线号
BL=高5位为设备号,低3位为功能号
AH=返回3种不同的代码。00H表示检测成功,86H表示未发现要检测的设备,83H表示入口参数中的供应商代码无效
CF=状态标志。为1表示检测错误,为0表示检测成功。
如果在该功能调用中,使索引号从0开始以1为增量递增,直到AH中的返回码为86H为止,便可检测出供应商识别码与设备识别码相同的所有设备。
3、PCI分类代码检测
入口参数:
AH=B1H
AL=03H
ECX=低三个字节为分类代码
SI=索引号,0~~N
出口参数:
BH=总线号,0~~255
BL=高5位为设备号,低3位为功能号
AH=00H表示检测成功,86H表示未发现要检测的设备
CF=1表示检测错误,0表示检测成功
如果在该功能调用中,使索引号从1开始以1位增量递增,直到AH中的返回码为86H为止,便可检测出具有相同分类代码的所有设备。
4、特殊周期的产生
入口参数:
AH=B1H
AL=06H
BH=总线号,0~~255
EDX=特殊周期数据
出口参数:
AH=00H表示特殊周期产生成功,81H表示不支持该功能
CF=1表示错误,0表示成功
5、读配置字节
入口参数:
AX=B108H
BH=总线号,0~~255
BL=高5位为设备号,低3位为功能号
DI=寄存器号,0~~255
出口参数
CL:读出的配置字节
AH=00H表示成功
CF=1表示错误,0表示成功
6、读配置字
入口参数:
AX=B109H
BH=总线号,0~~255
BL=高5位为设备号,低3位为功能号
DI=寄存器号,取值为0、2、4、6、8
出口参数
CX=读出的配置字
AH=00H表示成功,87H表示寄存器无效
CF=1表示错误,0表示成功
7、读配置双字
入口参数:
AX=B10AH
BH=总线号,0~~255
BL=高5位为设备号,低3位为功能号
DI=寄存器号,0、4、8、12
出口参数
ECX=读出的配置双字
AH=00H表示成功,87H表示寄存器无效
CF=1表示错误,0表示成功
8、写配置字节
入口参数:
AX=B10BH
BH=总线号,0~~255
BL=高5位为设备号,低3位为功能号
DI=寄存器号,0~~255
CL=写入的字节值
出口参数
AH=00H表示成功
CF=1表示错误,0表示成功
9、写配置字
入口参数:
AX=B10CH
BH=总线号,0~~255
BL=高5位为设备号,低3位为功能号
DI=寄存器号,0、2、4、6
CX=写入字的值
出口参数
AH=00H表示成功,87H表示寄存器无效
CF=1表示错误,0表示成功
10、写配置双字
入口参数:
AX=B10DH
BH=总线号,0~~255
BL=高5位为设备号,低3位为功能号
DI=寄存器号,0、4、8、12
ECX=写入双字的值
出口参数
AH=00H表示成功,87H表示寄存器无效
CF=1表示错误,0表示成功
PCI BIOS在PCI编程中起着一定的作用,PCI BIOS的资料也不是很好找,把找到的集中到这里,供参考。
1、确定系统是否实现32位BIOS
在调用32位BIOS之前,32位操作系统必须要确定系统中是否存在32位BIOS,以及入口点是什么?并不是所有的BIOS都支持32位调用。BIOS 32服务目录的实现必须嵌入一个特定的、相邻的16个字节的数据结构,其物理地址范围为0E0000H----0FFFFFH,数据结构中各字段的描述如 下,此数据结构必须排列在16字节地址边界。
偏移量 大小 含义
00H 4字节 ASCII表示的特征字符串,“_32_”,最左边的下标存储在偏移0中
04H 4字节 BIOS 32服务目录入口,是一个32位的物理地址
08H 1字节 修订版本号,为00H
09H 1字节 数据结构长度,以字节为单位
0AH 1字节 整个数据结构的检查和,其值必须为0
0BH 5字节 预留单元,必须为0
2、确定32位BIOS支持的服务
EAX=服务识别器。为确定32位BIOS是否支持指定的服务,服务目录程序根据EAX寄存器中的调用者提供的4字节的服务识别器执行查找。
BL=服务目录功能识别器。填00H。EBX的高三个字节为保留,必须清0。
在调用服务目录程序返回后,寄存器组中包含以下值:
(1)如果指定的服务存在,则AL包含00H;否则,包含80H;如果BL中包含的功能识别器未实现,则包含81H。
(2)EBX包含指定的BIOS服务的物理起始地址
(3)ECX包含指定的BIOS服务的长度
(4)EDX包含指定的BIOS服务的入口。这是EBX中返回的起始地址的偏移。
3、确定32位BIOS是否支持PCI BIOS服务
PCI BIOS服务的服务识别器包含ASCII串“$PCI”,在EAX中被指定为49435024H。假定服务目录程序调用后指出PCI BIOS存在,则可通过向EDX寄存器中返回的入口来执行远程调用。在调用PCI BIOS以前,操作系统必须将BIOS的代码和数据段定义为具有EBX和ECX中返回的物理地址范围。代码和数据段必须具有相同的起始地址。操作系统必须 启动BIOS的优先级,以允许I/O操作,且必须为BIOS定义一个容量至少为1KB的堆栈区域。BIOS设计者必须假定操作系统将代码段定义为只执行, 将数据段定义为只读。