1 概述
BBS定义了BIOS识别系统中IPL(Initial Program Load)设备的方法,使得BIOS可以按照用户设置的优先顺序来引导系统。
BBS使得BIOS可以将系统中的所有IPL设备放进一个列表,并保存在NV存储器中。IPL设备一般包括以下三种:BAID,PnP Card以及Legacy。BBS只支持BAID和PnP Card。
BBS最基本的一个功能是定义IPL优先级。IPL优先级是用户通过配置界面为IPL设备指定的,比如第一个启动设备为A:,第二个为C:…。用户每次开机时,系统都需要重新枚举所有的IPL设备。
如果从一个IPL设备启动操作系统失败,BIOS将重新获得控制权,并尝试从下一个IPL设备启动。所有IPL设备都尝试无法启动后,这个过程会才会结束。这时BIOS可以打印一个提示信息,告诉用户无法启动到操作系统,等待用户敲一个键后,重新调用INT 19h。
IPL设备实际上可以是任何可以加载操作系统的设备,包括软驱、硬盘、CD-ROM、PCMCIA等,将来还可能包括串口、并口等。
IPL设备的一个比较重要的功能是在引导操作系统失败后,必须要能返回BIOS,BBS定义INT 18h作为启动失败的恢复向量。比如,如果配置从一个网卡启动,但是没插网线,这时网卡的Oprom就应该通过调用INT 18h告诉BIOS无法引导操作系统。
2 BBS Table的创建与获取
CSM文档中定义EFI_LEGACY_BIOS_PROTOCOL,该Protocol提供了获取BBS table的接口函数:GetBbsInfo。
typedef
EFI_STATUS
(EFIAPI *EFI_LEGACY_BIOS_GET_BBS_INFO) (
IN EFI_LEGACY_BIOS_PROTOCOL *This,
OUT UINT16 *HddCount,
OUT HDD_INFO **HddInfo,
OUT UINT16 *BbsCount,
IN OUT BBS_TABLE **BbsTable
)
这个函数可以得到内部的BBS数据结构,以便对其进行修改。
Framework中定义了一个256项的BbsTable[256],其中BbsTable[0]对应的是软驱,从BbsTable[1]- BbsTable[16]分别对应一块硬盘,后面的所有项用于存放BEV和BCV。
硬盘对应的BbsTable为什么是16项呢?这是因为代码中假设平台支持的最大IDE控制器个数为8,每个控制器可以有两个驱动器Master和Slave。
函数首先判断软驱是否连接,如果有连接有是否有软盘……,然后填充BbsTable[0]。完成后就轮到HDD了,先读取系统中的硬盘驱动器的信息HddInfo,根据该信息分别填充BbsTable[1]- BbsTable[16]。最后通过调用legacy16的1号函数Legacy16UpdateBbs,将不兼容BBS的Oprom加入到BbsTable中。
涉及到的代码都在文件LegacyBios/LegacyBoot.c中。