UEFI开发探索35 – Option ROM前传2

在Legacy BIOS的Option ROM开发过程中,除了需要注意代码结构外,代码生成文件的大小也得小心,BIOS文件预留的空间不多。我一般将生成文件控制在12K左右。

当然,在后期的产品开发中,我们开始与联想和方正合作,Option ROM文件是请BIOS工程师编译进BIOS的,上述的限制就不需要那么严格了。

1 校验和的问题

Option ROM文件,要求字节校验和必须为0。而在隔离卡销售过程中发现,有些BIOS要求字校验和为0。

所谓字节校验和,也即把文件的内容一个字节一个字节加起来,其和为0;而字校验和则是按字为单位加起来,其和为0。

这种工具没有现成的,必须自己编写。

问题来了,怎么保证一个文件同时满足字节校验和以及字校验和为零?

我设计的算法很容易懂,步骤如下:

1) 首先计算字校验,文件末尾添加一个字,保证其字校验和为零;
2) 计算其字节校验和,得到一个数,比如0xFE;
3) 在文件中添加字0x00FE,并再添加0xFE个字0xFFFF;
4) 至此结束。

第1步已经保证了字校验位零,而所添加的0xFE个0xFFFF,加上0x00FE,也是字校验为零(可以把0xFFFF看做-1,则很容易思考);而第2步中,字节校验和已经是0xFE,添加的0x00FE,字节校验和变为了0xFE+0xFE,所添加的0xFE个0xFFFF,刚好是2*0xFE*(-1),使得字节校验和变为零。

经过这种添加冗余数据,达到了字节校验和以及字校验和都为零。

图1 调整校验和

很容易计算出,需要添加的冗余字节最大数目为257*2=514个,对生成的文件大小影响不算大。

根据上述算法,可以编写出相应的工具,将编译好的执行文件(一般编译为*.com执行文件)转换为符合要求的ROM文件。

2 再论程序结构

在编写程序的过程中,要始终牢记,是由BIOS调用Option ROM。因此,Oprom第一件事情就是需要保存好各个寄存器的值,在执行完后还回去,防止BIOS罢工。

图2 Option ROM程序结构

我一般会将各个段寄存器和通用寄存器保存到0x900:0处(学linux的),同时把堆栈指向0x8000:mystack。主程序main开始时,所有数据也会拷贝到0x8000:0处(数据段与堆栈段在一个段内)。

做完这些工作后,main函数会调用MAIN_MOUDLE函数,开始工作。

这样安排是经过很多主板测试的,理论上这几个内存空间BIOS都不会使用。不过,幸好每代的主板和BIOS都是需要改造的,不需要兼容太多主板。如果想自己写个Option ROM,不建议占用这么多段,尽量放在一个段内较好。

以上安排都是针对实模式的,如果需要用到保护模式的代码,则记着一定要返回到实模式下。 在后期的产品中,曾经需要访问1M以上的内存(主要是为了实现保密局要求的安全功能),我就这么干过。至于如何进入保护模式,就不展开讨论了。

3 如何调试代码

Option ROM必须嵌入到BIOS中才能运行,这给调试工作带来了困难。

幸好所有的Option ROM代码,调用的都是BIOS中断,在DOS下完全可以运行。因此,可以将代码结构修改一下,改为可以在DOS下运行。

图3 DOS下程序结构

注意图中的MAIN_MOUDLE,它调用的就是Option ROM的同一函数。

在DOS环境下,使用debug.exe就可以调试代码了。Debug的使用说明,在之前的博客中已经记录过。

当然,如果不涉及到与硬件卡通信,比如调试图像显示,是可以在DOS虚拟机中调试的。我以前都是使用Virtual PC这一古老的虚拟机调试DOS程序的,最近开始使用DOS BOX了。

图4 DOS下的界面

把以前的代码编译,在dos box试运行,如图4所示。仿佛看到了当年挥汗调试的自己,百感交集。

4 嵌入到BIOS

我自己写了将.com文件转换为符合要求option rom文件的工具,名称为c2b.exe。观察百度云上提供的批处理文件INBIOS.bat,其主要命令如下:

MASM    SYBIOS.ASM
LINK /T    SYBIOS.OBJ
C2B SYBIOS.COM SYBIOS.BIN
Cbrom215.exe QDI.BIN /ISA SYBIOS.BIN

Masm和link是微软提供的汇编编译器,c2b.exe是自制转换工具,而cbrom215.exe是Award提供的bios文件处理工具。以“/ISA”的命令行方式可以将ISA ROM代码嵌入到指定的BIOS中。

我所开发的底层界面软件名称为SYBIOS,按上述方法编译生成SYBIOS.bin。使用Cbrom.exe V2.15将其嵌入到Award的BIOS中。图5显示了嵌入ISA ROM模块的BIOS模块,第15个模块即为ISA ROM模块。

图5 ISA ROM嵌入到BIOS中

平心而论,Legacy BIOS下的编写Option ROM,搭建框架的时候比较难,全部都是汇编代码,也难以维护。不过,代码不容易出现问题,而且也容易仅凭猜想就定位问题所在。

随着Legacy BIOS的退出舞台,这些Option ROM也逐渐失去了应用场景。我将文中用到的一些代码放在百度云上了,仅供研究使用。

把这两篇博客当做Legacy BIOS下Option ROM的挽文吧,我们还是把注意力调整回UEFI。下篇详细描述如何开发UEFI下的Option ROM。

百度云链接:https://pan.baidu.com/s/1gccSosw8_UAGTI5gZPnLCA
提取码:dx23
文件在 X6 Legacy BIOS Oprom 下
/校验和调整:同时满足字校验及字节校验都为零的工具代码(16位编译器编译,bcc3.1)
/SYBIOS1224: Option ROM例子,使用Masm6.11编译

34 total views, 3 views today

发表评论

电子邮件地址不会被公开。 必填项已用*标注