基于UEFI规范的BIOS多线程运行机制研究与设计

2014-07-24 19:01张远虎相明琼吴猷杨勇
微型电脑应用 2014年12期
关键词:状态机线程队列

张远虎,相明琼,吴猷,杨勇

基于UEFI规范的BIOS多线程运行机制研究与设计

张远虎,相明琼,吴猷,杨勇

对基于UEFI规范的 BIOS(简称UEFI BIOS)的运行环境,执行流程及其框架结构进行了详细分析;基于OS下的多线程思想,提出了基于UEFI BIOS环境下的多线程设计理念和方案;严格遵循UEFI 标准,实现并验证了基于UEFI的多线程方案,完成了启动过程中多线程库的研究。经实际应用验证,方法简便,具有较强的实用性。

UEFI;BIOS;多线程

0 引言

BIOS(Basic Input Output System[1]),它是计算机运行的第一个程序,该程序保存了电脑的详细硬件信息,担负着初始化计算机硬件,检测硬件功能以及引导操作系统的作用。2000年,Intel公司发明了用以规范BIOS开发的可扩展固件接口(Extensible Firmware Interface,EFI)[2],用以规范PC固件体系结构、接口和服务的建议标准。之后,业界多家著名公司制定了新的国际标准UEFI规范,基于UEFI规范的 BIOS又称为UEFI BIOS。本文从UEFI BIOS的架构着手,分析UEFI BIOS启动的各个阶段,结合实例剖析了多线程这项复杂技术的设计思路和实现方法。

1 UEFI BIOS的先进性

近年来,计算机硬件技术更新迅速,传统的 BIOS(Legacy BIOS)技术由于功能的局限性,已成为技术进步的包袱。目前,最新的UEFI BIOS日趋成熟,其设置操作均模仿 Windows操作系统下的使用体验,支持鼠标点击来切换菜单、调整配置选项。下面从扩展性和兼容性两方面简要说明遵循UEFI规范的BIOS相比Legacy BIOS的先进性:

(1)高扩展性

UEFI BIOS代码98%以上使用C语言编写,内置图形驱动功能,提供强大的连网功能,支持32位或64位运行模式,突破了传统16位代码的寻址能力,达到处理器的最大寻址,提高了BIOS代码的运行速度。另一方面,使用模块化设计,在逻辑上分为操作系统软件管理和硬件控制两部分,操作系统软件管理提供一个开放的可编程的接口,为系统的后期扩展提供了无线的可能性。以系统诊断功能为例,在不开启操作系统情况下,UEFI BIOS可实现通过互联网对计算机远程故障排查的功能。

(2)良好兼容性

UEFI借鉴了以“Byte Code”形式存在的JAVA语言能够在多种平台上运行的编译模式,从而实现了基于UEFI规范的BIOS的良好兼容性。UEFI BIOS的驱动由EFI Byte Code(EFI字节代码)编写而成,EFI Byte Code是一组用于UEFI驱动的虚拟机器指令,必须在UEFI驱动运行环境下被编译、运行,这种中间件机制使得UEFI BIOS具有更好的兼容性,同时也降低了UEFI驱动编写的复杂性,缩短了系统的研发时间,降低了计算机配件供应商的准入门槛。

2 UEFI相关技术简介

2.1 UEFI框架

UEFI规范定义了完整的标准接口和数据结构,UEFI规范和传统的BIOS本质上是没有区别的,都是为了能够把不同的硬件平台封装成为操作系统(OS)能够识别的统一软件接口,使得所有的硬件平台都能用统一的接口、协议和服务展现出来。从整个平台的架构上看,它处于系统抽象层(System Abstract Layer)的地位,多线程服务在uFFI架构中的位置,如图1所示:

图1 UEFI系统抽象

从图1中可知,UEFI是对整个硬件平台的软件抽象,它暴露给OS的只有标准的服务和接口。从软件架构来区分,可分成3层[3]:处理器抽象层(PAL,Processor Abstraction Layer)、系统抽象层(SAL, System Abstraction Layer)、可扩展固件接口(EFI,Extensible Firmware Interface)。UEFI仅支持单线程,只支持时钟中断,这也是硬件设备的操作[4]只能使用轮询的方式来操作的根本原因。

2.2 PI(Platform Initialization)规范

UEFI规范定义的都是接口,对于怎么去实现这些接口该规范并没有做过多的限制。显然,通过程序实现这套规范是很复杂的。UEFI论坛定义出了平台初始化标准,被命名为PI(Platform Initialization)。平台初始化分阶段地把UEFI接口的实现定义成了7个阶段,他们分别是SEC,PEI,DXE,BDS,TSL,Runtime,AfterLife。PI和uFFI之间的关系,如图2所示:

图2 PI和uEFI关系

从图2中可知,整个PI定义的就想一个英文字母H的框架。形象地理解为,往这个框架里面可以填入各个模块。经过所有的模块的运行,UEFI包装并提供了所有的 UEFI规范中定义的接口和协议。

3 UEFI BIOS的执行流程

UEFI BIOS实际上是基于Intel的Framework,严格遵循PI标准定义来搭建整个UEFI环境,并向OS提供标准的可扩展接口。PI标准定义了SEC,PEI,DXE,BDS,TSL,RT,AL共7个阶段,如图3所示:

图3 uEFI的各个阶段示意图

4 多线程设计理念

众所周知多线程在多核系统上有很多的优点,但是由于多年前我们的处理器只是单核,加上设计多线程的软件产品是更为复杂。大多数软件,包括最新的UEFI BIOS都是单线程的。

4.1 系统设计原则

遵循uEFI 规范,对其他EFI组件不做修改。要做到更好的模块化;

独立的模块,以Protocol的形式提供线程服务,这样才符合uEFI 的宗旨易于扩展和升级;

保证以实现规定的顺序加载EFI驱动,并保证驱动程序的完整性;

保证EFI Shell命令,EFI应用程序以及OS加载器的完整性;

保证多线程服务的可靠性,包括线程的创建,取消,终止;

保证多线程服务变量的一致性,包括全局变量和局部变量;

保证多线程服务调度的合理性,包括避免调度可能出现的死锁;

采用线程1:1模式来映射LWP,且保证每一个CPU内核运行一个线程。

4.2 系统设计方案

本论文在DXE阶段和BDS阶段设计的多线程服务库主要保障DXE驱动程序加载的正确性和驱动程序安装服务的完整性。保证在DXE后期和BDS阶段,其他驱动使用的线程服务的合法无误。本论文中设计的线程调度算法,默认是EFI_SCHED_FCFS,当然这是最基本的算法的实现,另外还有EFI_SCHED_QUEUE,EFI_SCHED_OTHER。

EFI_SCHED_FCFS

FCFS显然是最简单,最容易操作的算法。而一切更为复杂的算法,也大多都是基于这个算法做的更深入的修改。

EFI_SCHED_QUEUE

该算法是就是创建多个队列,每个队列里面存放等待线程。它可以提高系统吞吐量,提供叫好的I/O设备利用率。往往这个算法也结合优先级算法一起使用达到更好的效果。

EFI_SCHED_OTHER

EFI_SCHED_OTHER是本论文中增强的调度算法,该算法是融合了先到先服务算法,多级队列调度算法,优先级算法为一体的综合算法。所以,默认算法有着比较均衡的性能指标。能够取各种算法的优点,同时又能避开各个算法的缺点。基本上达到了取长补短的目的。

4.3 多线程的总体架构设计

本论文的设计方案,其多线程服务库是通过EFI驱动在DXE阶段加载后建立的标准的uEFI 协议实现。由于标准的EDK[5]并没有提供创建这些服务程序的驱动,因此必须首先要开发建立多线程服务的EFI驱动。

最底层是真正的硬件平台,也就是物理多核 CPU。它是真实存在的物理设备,没有被任何软件抽象。基于 uEFI的协议,实现了线程服务的调度,创建,取消,同步等工作。

4.4 uEFI 多线程服务的实现

多线程服务是线程库的底层实现。包含线程的状态机设计,硬件处理器的状态机设计,以及线程服务的核心调度器的设计,3个大方面。

4.4.1 线程的状态机

线程在调度器的协调下能够正常地工作,关于线程的状态切换,这里做一个比较直观的说明,如图4所示:

图4 线程的状态机

从图4 中可以看出:

线程被创建以后,该线程就成为默认状态;

随后会被创建线程的函数插入到线程等待队列中成为线程队列等待状态;

线程如果被调度,则该线程就会运行起来,成为线程运行状态;

线程如果正在等待,同时又有取消的请求,那么调度器就会取消线程,该线程进入到取消状态;

最后线程处理完毕,或者直接调用线程服务中的退出函数达到退出状态。

4.4.2 处理器的状态机

在线程的启动,运行,退出的过程中,线程的服务会对处理器做出不同的操作。有时候需要等待 CPU,有时候需要启动CPU,等等,CPU状态机示意图,如图5所示:

图5 处理器的状态机

如图5所示,处理器一共有4种状态:

处理器在多处理器服务的操作下能够实现关闭,开启的状态。

线程服务则可以利用处理器空闲的状态来调度线程,并运行之。

4.4.3 多线程服务协议

多线程服务协议提供了一种比较通用的uEFI 协议来完成多线程的各种工作,EFI_THREAD_SERVICES_PROTOCOL这个协议服务协议就是本论文开发的重中之重。在这个协议里面提供了所有多线程服务锁需要的功能函数。简单描述一样如下:

ThreadCreate创建一个线程

ThreadDetach处理等待某个线程

ThreadJoin同步等待一个线程

ThreadExit终止一个线程

ThreadCancel脱离一个同步好的线程

ThreadSelf获取自身的线程ID

ThreadMutexLock线程对变量加锁

ThreadMutexUnlock线程对变量解锁

ThreadMutexTryLock线程尝试对变量加锁

4.4.4 线程调度器的程序实现

本论文的调度器在默认情况下使用EFI_SCHED_FCFS。线程调度器是多线程服务的核心,它的访问对象就是32个循环队列构成的数组。对于每一个特定的队列,则每次都去询问并执行。每一个循环队列在被调度的过程中是按照入队的先后顺序来调度的。在优先级调度的时候,是按照在创建线程的时候,默认的优先级数来调度的。

在调度器的内部还有一个计数器,确保每次调度线程都是较高优先级的。并且级别较低的线程等待时间超过规定时间,那么调度器会自动提升低优先级的线程优先级数。线程调度器的核心流程图,如图6所示:

图6 调度器核心流程

4.5 uEFI 多线程程序的应用

多线程的优势在其他的操作系统下面已经都得到了论证。那么这个小节主要介绍多线程的在uEFI 下的应用。

uEFI 的快速启动

最刚性的需求是WIN8对OS和BIOS的启动时间做了非常精确的定义。比如在笔记本电脑上,用SSD的情况下,必须要在2秒内进OS;台式机则是4秒。这对于传统的BIOS来说是一项很大的挑战。显然,多线程在这个方面表现是客观的。不过目前,BIOS行业还没有采用这一技术。可以预见的未来,在BIOS快速启动这一块,多线程可以做出很多的贡献。

uEFI 应用程序的性能提高

在uEFI 的环境下,现在已经越来越多的普通的EFI应用程序大量出现在研发部门和工厂部门。在市场上也出现了多种多样的EFI应用程序。尤其uEFI 在画图的方面原本就做了很多的提高。在用到Hii的时候,那么多线程显得尤为有优势。纯软件的设计和操作,正是多线程的强项。

uEFI 应用程序的反应速度提高

多线程能够提高那些数量计算较多的反应速度。比如现在很多大厂(HP, DELL等等),他们在主板出货之前都会做严格的硬件诊断。而这些诊断程序都是在EFI SHELL下运行的。其中不乏有大量数据处理的EFI应用程序。那么,这个时候,多线程服务就派上用场了。

5 总结

本文通过研究uEFI BIOS的架构和实现原理,具体实现了uEFI 环境下的多线程服务,丰富并增强了uEFI 这个可扩展接口的标准。该多线程服务,可以提高应用程序的性能,可以提高加快BIOS的启动速度,可以提高应用程序的反应速度等。因此,该多线程服务技术有很高的使用价值。

[1] 陈文钦.BIOS研发技术剖析[M].北京:清华大学出版社,2001.9.

[2] Intel Inc..Extensible Firmware Interface Specification[J]. Intel Inc.,2002,12

[3] Intel Inc..Intel®Itanium®Processor Family System Abstraction Layer Specification Version 3.4[J].Intel Inc.,2009,5

[4] Lubomir F.Bic,Alan C.Shaw.Operating System Principles[M],北京:清华大学出版社,2004.

[5] Intel Inc..EDK Getting Started Guide[J],2005, 6

Research and Design Of BIOS’s Multi-Thread Operating Mechanism Based on UEFI Standard

Zhang Yuanhu1, Xiang Mingqiong2, Wu You2, Yang Yong3
(1. Shanghai Jiaotong University, Shanghai 201201, China; 2. Shanghai Enty-Exit Inspection and Quarantine Bureau, Shanghai 201201, China; 3. Shanghai Institute of Satellite Engineering, Shanghai 201201, China)

This paper analyzes the BIOS’s running environment, framework and its executive process based on UEFI. Based on the Pthread theory under the OS, it proposes the the design concept and scheme of multi-thread under UEFI BIOS environment. After following UEFI specification restrictly it realizes and verifies multi-thread scheme based on UEFI, and finishes the research of multithreadingservice in the start-up procedure. It is veried in the practical application that it is convenient and is of strong practicability.

UEFI; BIOS; Multi-Threa

V474

A

2014.10.11)

1007-757X(2014)12-0035-03

张远虎(1985-),男,汉族,刺穿泸县,晟碟信息科技有限公司,硕士,研究方向:BIOS系统设计与研究,上海,201201

相明琼(1987-),男,汉族,山东聊城,上海出入境检验检疫局,工程师,硕士,研究方向:信息化管理、UEFI研究,上海,201201

吴 猷(1982-),男,汉族,浙江宁波,上海出入境检验检疫局,助理工程师,研究方向:信息化管理、UEFI研究,上海,201201

杨 勇(1980-),男,汉族,山西运城,上海卫星工程研究所,高级工程师,硕士,研究方向:电子系统研发、射频通信,上海,201201

猜你喜欢
状态机线程队列
基于C#线程实验探究
队列里的小秘密
基于多队列切换的SDN拥塞控制*
基于国产化环境的线程池模型研究与实现
基于有限状态机的交会对接飞行任务规划方法
在队列里
丰田加速驶入自动驾驶队列
浅谈linux多线程协作
三段式状态机在单片机中的实现
基于反熔丝FPGA的有限状态机加固设计