标题: [原创]32位 BIOS说明
[打印本页]
作者: whowin
时间: 2008-5-9 11:26
标题: [原创]32位 BIOS说明
文章是从我的网志中贴过来的,其中的图片可能过不来,看完整内容,请访问我的网志:
点击进入《DOS编程技术》
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设计者必须假定操作系统将代码段定义为只执行,将数据段定义为只读。
更多关于DOS编程的文章看我的网志
点击进入《DOS编程技术》
[
Last edited by whowin on 2008-5-9 at 11:44 AM ]