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 设计者必须假定操作系统将代码段定义为只执行,将数据段定义为只读。

欢迎访问我的博客:https://whowin.cn

email: hengch@163.com

donation