UEFI开发探索34 – Option ROM前传1

(请保留-> 作者: 罗冰   https://blog.csdn.net/luobing4365)

下面开始进入系列博客的主线-Option ROM的开发。

我预备用3篇将这个问题说清楚。包括Legacy BIOS下的Oprom,以及如何搭建UEFI下Oprom,包含为了开发Oprom我所自制的几个工具。

我曾经有很长一段时间与Legacy BIOS的Option ROM打交道,在没有示例程序、没有人指点的情况下,苦苦探索,痛苦而又充实。

一切都从这个文档开始:

图1 pnp bios spec

起源

刚毕业两年左右,公司计划开发一款物理隔离的主板。我们总工只有板卡类的开发经验,从来没有开发过这么复杂的产品,而且产品目标之一是修改ACPI的流程,一群人都没有相关经验,大眼瞪小眼。

硬件的工作暂时不论,软件都是由我负责。大概包括:

1) 作为协议中心的MCU固件代码,提供windows App与板块的通信通道,提供PCI Option ROM与板块的通信通道;
2) windows App,提供操作系统层的用户使用接口;
3) PCI Option ROM,提供底层的用户使用接口。

再深入讨论的结果,不能使用PCI Option ROM,因为需要增加一个近20块钱的WCH365,而且发现驱动代码不稳定。

最终只能考虑将Option ROM嵌入到BIOS中,同时用一款Cypress的芯片同时打通两个通信通道。

就这样,完全不具备相关知识(当时汇编语言也没学)的我,一头扎入了这个巨大无比的问题旋涡,一点点攻克路上遇到的各种问题,直到奇迹般地做出了第一个打印“Hello,world!”的Oprom。

探索和思考

我翻遍了南京的大小图书馆,以及我能找到的一切参考书。最终在母校图书馆的一本计算机杂志上看到,可以通过Cbrom.exe把BIOS文件提取出来。

我如获至宝,把那篇文章读了又读。而后在网络上找到一款名为bfdisk的工具,在介绍此工具的文章中,有这么一句话(图中标红处):

图2 嵌入到BIOS中的分区工具

就是这句话,让我找到了如何编写Oprom格式的依据。

当然,即便知道格式,也有非常多的问题需要解决。比如用汇编写代码、转换编译后的文件为ROM文件、图像编程的知识、各种外设访问的方法等等。

这个UEFI探索博客,其实与我当年做的事情是类似的,只是我现在知识比当时丰富得多,能很快进入UEFI的各种开发。

我像疯了一样拼命吸收新知识,那种灵魂燃烧的感觉现在都记忆犹新。真希望能一生都保持对新知识的渴望。

3 Option ROM格式

所谓Option ROM就是在位于PCI或者ISA设备上的只读存储器,因为这个存储器不是总线标准规定一定要实现的,所以叫Option ROM(可选实现的ROM)。

Option ROM里面通常存放着用于初始化该设备的数据和代码。显卡和网卡等设备上通常带有Option ROM。简单来说,在它的开始处,总是一个固定结构的头结构,称为PnP Option ROM Header。

在头结构的偏移18h和1Ah处可以指向另外两个结构,分别称为PCI数据结构和PnP扩展头结构(PnP Expansion Header),简称为PEH。PEH中有一个起到链表作用的Next字段(偏移06h,长度为WORD)用来描述下一个扩展结构的偏移。如图:

图3 Option ROM 头结构

ISA ROM结构不需要完全按照以上的结构来编写。其中要注意的有两点:

1) 偏移2h处填写Option ROM的长度,其以2k为一个单位。即如果整个ROM代码为20k的话,填写0ah即可。
2) 整个ROM代码必须校验和为0。即从ROM的第一个字节直至最后一个字节,这些字节相加后的和必须为0。

如果BIOS检测到ROM代码符合pnp BIOS的规范,将使用FAR CALL调用偏移3h处的入口向量,控制权将转交给Oprion ROM代码。当然,为了正常将控制权返回给BIOS,在Option ROM代码的最后必须使用RETF,将控制权交出。

代码结构

了解到Option ROM的结构后,就可以进行编程了。需要注意,Option ROM在运行的时候,只能调用BIOS的中断。

考虑到结构的控制,以及库的链接问题和文件大小,最好使用汇编语言进行编写。使用汇编编译器将其编译成执行文件,并使用工具转换为符合要求的BIN文件。

典型的程序结构如下:

.MODEL TINY                                                   
.486
.CODE
ORG 0H
START:
DW 0AA55h                 ;扩展BIOS标志
DB 40h  

Call Main                  ;Main为主程序入口
Retf                        ;控制权返回给BIOS

在Main函数中实现所需要的功能即可。

编译器使用MASM6.11,采用上述 ISA ROM模块的代码,并用Link /T链接obj文件,生成COM文件。然后按照PNP BIOS的要求,编写COM文件转换为字节校验和为0的BIN文件的工具程序,使用此工具程序将COM文件转换为BIN 文件。

之后,将bin文件嵌入到BIOS中,就完成了Option ROM的开发过程。

(待续…)

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Compaq Computer Corporation Phoenix Technologies Ltd. Intel Corporation BIOS Boot Specification 1.0 INTRODUCTION 5 1.1 REVISION HISTORY 5 1.2 RELATED DOCUMENTS 5 1.3 PURPOSE 5 1.4 TERMS 6 2.0 OVERVIEW 9 2.1 DESCRIPTION 9 3.0 IPL DEVICES 10 3.1 REQUIREMENTS FOR IPL DEVICES 10 3.1.1 IPL TABLE 10 3.1.2 PRODUCT NAME STRING 10 3.2 BAIDS 11 3.3 DEVICES WITH PNP EXPANSION HEADERS 11 3.4 LEGACY IPL DEVICES 12 3.5 IDENTIFYING IPL DEVICES 13 3.5.1 BAIDS 13 3.5.2 PNP EXPANSION HEADER 13 3.5.3 PCI DEVICES 13 3.5.4 IDENTICAL IPL DEVICES 14 4.0 IPL PRIORITY 15 4.1 MAINTAINING THE IPL PRIORITY 15 4.2 IPL PRIORITY PSEUDOCODE 17 5.0 BCV PRIORITY 18 5.1 INTRODUCTION 18 5.2 INT 13H DEVICE CONTROLLERS 18 5.2.1 ATA DRIVE SUPPORT IN THE BIOS 18 5.2.2 PNP CARDS WITH BCVS 19 5.2.3 LEGACY CARDS WITH OPTION ROMS 19 5.2.4 HARD DRIVE BAID 19 5.2.5 CONTROLLER INSTALLATION GUIDELINES 19 5.2.6 NOTES ON INT 13H DEVICES 20 5.3 INSTALLATION ORDERING 20 5.4 POST PSEUDOCODE 22 6.0 POST SEQUENCE 23 6.1 POWER-ON INITIALIZATION 23 6.1.1 INITIALIZING BAIDS 23 6.1.2 PNP BOOT DEVICES 23 6.2 PNP OPTION ROM INITIALIZATION 23 6.3 CHECK IPL PRIORITY AND BCV PRIORITY 24 6.4 INT 13H DEVICE CONTROLLER INSTALLATION 24 6.4.1 BOOT CONNECTION VECTORS 25 6.4.2 DISCONNECT VECTOR 25 6.4.3 LEGACY ROM SCAN 26 6.4.4 ON-BOARD ATA SUPPORT 26 6.5 INT 19H PROCESSING 26 6.5.1 BOOTING FROM BAIDS 27 6.5.2 BOOTING FROM BEVS 27 6.6 INT 19H PSEUDOCODE 28 6.7 INT 18H PSEUDOCODE 28 6.8 NOTES ON THE POST PROCESS 29 APPENDIX A: DATA STRUCTURES 30 A.1 IPL TABLE AND BCV TABLE ENTRY DATA STRUCTURE 30 A.2 PNP OPTION ROM HEADER 31 A.3 PNP EXPANSION HEADER 31 A.4 PCI DATA STRUCTURE 31 APPENDIX B: RUN-TIME FUNCTIONS (OPTIONAL) 32 FUNCTION 60H - GET VERSION AND INSTALLATION CHECK 32 FUNCTION 61H - GET DEVICE COUNT 33 FUNCTION 62H - GET PRIORITY AND TABLE 34 FUNCTION 63H - SET PRIORITY 35 FUNCTION 64H - GET IPL DEVICE FROM LAST BOOT 36 APPENDIX C: BOOT MENU (OPTIONAL) 37 C.1 BOOT MENU POP-UP 37 C.2 BOOT MENU INT 19H PSEUDOCODE 37 C.3 BOOT FIRST RUN-TIME FUNCTIONS 38 FUNCTION 65H - GET BOOT FIRST 38 FUNCTION 66H - SET BOOT FIRST 38 APPENDIX D: RECOMMENDED BOOT SECTOR CHANGES (OPTIONAL) 39 D.1 USE DL FOR DRIVE NUMBER 39 D.2 INT 18H ON BOOT FAILURE 39 APPENDIX E: PCI WITH MULTIPLE PNP HEADERS (OPTIONAL) 40 E.1 DESCRIPTION 40 E.2 REQUIREMENTS 40 E.3 OPTION ROM INITIALIZATION 40 E.3.1 BEFORE OPTION ROM PLACEMENT 40 E.3.2 PLACING THE PCI OPTION ROM 40 E.3.3 CALLING THE PCI OPTION ROM 41 E.3.4 NO DEVICES PRESENT 41 E.3.5 DEVICES ARE PRESENT 41 E.4 ENUMERATING PNP EXPANSION HEADERS 42 E.5 CALLING THE BCVS 42
高通UEFI是高通公司为了支持其处理器和芯片组在Android设备上的引导和初始化而开发的软件模块。UEFI(统一扩展固件界面)是一种新型的固件标准,取代了过去的BIOS(基本输入输出系统)。高通UEFI开发Android开发文档主要提供了有关在使用高通处理器和芯片组的Android设备上进行开发的指导和说明。 该文档首先介绍了如何正确设置开发环境,包括安装必要的软件和驱动程序。接着,文档介绍了高通UEFI的架构和工作原理,包括引导流程、启动流程和初始化过程。开发人员可以深入了解UEFI在Android设备上的作用和功能。 文档还提供了如何进行UEFI开发的具体指导,包括如何编写UEFI应用程序、如何调试和测试UEFI应用程序以及如何进行项目集成等。针对不同的开发需求,文档也提供了各种开发和定制UEFI的选项和工具,使开发人员能够根据实际情况进行灵活的开发和调试。 此外,文档还包含了一些实际案例和示例代码,帮助开发人员更好地理解如何使用高通UEFI开发Android设备,并且提供了一些常见问题和解决方案以供参考。 总而言之,高通UEFI开发Android开发文档为开发人员提供了一个全面的指南,帮助他们理解和应用高通UEFI在Android设备上的开发和定制。通过这些文档,开发人员可以更加有效地利用高通UEFI提供的功能和特性,为Android设备开发出更加稳定和高性能的引导和初始化软件。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luobing4365

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值