32位 BIOS 说明
文章目录
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;
- 在调用服务目录程序返回后,寄存器组中包含以下值:
- 如果指定的服务存在,则 AL 包含00H;否则,包含 80H;如果 BL 中包含的功能识别器未实现,则包含 81H;
- EBX 包含指定的 BIOS 服务的物理起始地址;
- ECX 包含指定的 BIOS 服务的长度;
- 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 设计者必须假定操作系统将代码段定义为只执行,将数据段定义为只读。
欢迎访问我的博客:https://whowin.cn
email: hengch@163.com
文章作者 whowin
上次更新 2008-03-18