FT-2000/4芯片集成4个飞腾自主研发的新一代高性能处理器内核FTC663,采用乱序四发射超标量流水线,兼容64位ARMV8指令集并支持ARM64和ARM32两种执行模式,支持单精度、双精度浮点运算指令和ASIMD处理指令,支持硬件虚拟化。
FT-2000/4从硬件层面增强了芯片的安全性,支持飞腾自主定义的处理器安全架构标准PSPA 1.0,满足更复杂应用场景下对性能和安全可信的需求。
该产品适用于构建有更高性能、能耗比和安全需要的桌面终端、便携式终端、轻量级服务器和嵌入式低功耗产品,支持商业和工业分级。 [1]
主要技术参数:
处理器内核 | FTC663 |
核数 | 4 |
主频 | 2.2GHz、2.6GHz |
一级缓存 | 32KB数据缓存,32KB指令缓存 |
二级缓存 | 4MB |
三级缓存 | 4MB |
片上存储器 | 集成128KB片上存储 |
存储控制器 | 2个DDR4接口,支持DDR存储数据实时加密,兼容DDR3、DDR3L |
PCIE接口 | 2个x16(每个可分拆为2个x8)和2个x1 PCIE 3.0接口 |
网络接口 | 2个10/100/1000Mbps自适应以太网接口 |
其他接口 | 1个SD 2.0,1个HD-Audio,4个UART,32个GPIO,1个LPC,4个I2C,1个QSPI接Flash,2个通用SPI,2个WDT,3个CAN 2.0 |
安全技术 | 支持PSPA安全标准1.0,支持基于域隔离的安全机制,集成ROM作为可信启动根,集成多种密码加速引擎 |
低功耗技术 | 支持电源关断、时钟关断、DVFS以及关核、降频操作,支持待机、休眠模式 |
典型功耗 | 40W |
封装 | FCBGA,引脚个数1144 |
尺寸 | 35mm x 35mm |
一、产品简介
1.1 产品描述
作为百敖的旗舰产品,飞腾 UEFI BIOS基于UEFI EDK II规范,经过严格的开发及测试流程,应用了最新的UEFI标准,采用模块化设计,可以很容易的移植到不同的平台,包括服务器,台式机,笔记本,移动设备,嵌入式设备等。相比较传统的BIOS,UEFI BIOS基于UEFI标准,能够提供更大的灵活性,在预启动环境可以完成更多的工作。
百敖飞腾 UEFI BIOS针对飞腾FT2000处理器进行了升级,全面支持飞腾FT2000平台,飞腾UEFI BIOS基于飞腾CRB(客户参考板)进行开发,在支持FT2000公板平台的基础上增加了很多百敖的特定功能,满足各种应用场景的要求,并且根据OEM/ODM的需要提供定制化服务,帮助客户迅速开发产品。
百敖软件创立于 2006 年,是领先的固件供应商及软件服务提供商,公司产品涵盖 UEFI BIOS、BMC、EC 及配套工具,支持多种芯片架构(包括 X86、Arm、MIPS、Alpha 等),广泛应用于 PC、服务器、物联网、工控、消费等领域。
1.2主要功能
飞腾UEFI BIOS 飞腾FT2000版本支持以下主要功能:
UEFI及平台功能
支持UEFI 2.5及PI 1.2标准
支持飞腾FT2000+处理器
支持Linux/UEFI Shell
高级功能
快速启动
多语言支持(中文/英文)
Boot功能
硬盘模式启动
光驱模式启动
USB模式启动
网络模式启动
支持热键
BIOS管理
BIOS Setup下固件更新功能
启动信息支持串口输出
密码管理
管理员密码
开机密码
控制重定向功能
支持串口的控制重定向功能
显卡
HD5450 7450 7470 7750 8450 8470
E6460 E6465 E6760
R5340 R5235 R7240及SM750、SM768
BMC里显卡支持列表:Aspeed 2400/2500
ATA/ATAPI功能
支持SATA AHCI模式
USB功能
支持USB1.0/2.0/3.0
POST阶段/UEFI Shell环境下支持USB键盘鼠标热插拔
Video
板载Video
支持UEFI模式下的显卡
Debug支持
COM口调试支持
内存配置
Memory Topology Detection and Display
Memory Operating Speed Display
内存大小
PCI/PCI-e
支持PCI 2.3
支持PCI-X
PCI FW 3.0
PCI-e 1.1/2.0
二、 基础代码架构与文件目录介绍
2.1 代码基础结构及文件目录
飞腾FT2000+ BIOS使用UEFI构架,Code有99%的C代码和极少量的汇编代码组合而成。由INF文件和源文件(c、汇编等)组成一个个模块,定义在一个DEC文件描述包内,最后由平台文件DSC和FDF来选择参与编译和最终包含进BIOS的模块。
2.2 主要的Package介绍
主要package简介如下。
ArmPkg:提供了ARM平台硬件相关模块,如GIC、CPU、Timer以及ARM指令集。
ArmPlatformPkg:提供ARM平台相关的驱动模块,如Flash、GPIO等。
BaseTools: 提供了BIOS编译的二进制可执行工具,以及BIOS编译的配置文件模板。
ByoModulePkg: 提供了百敖定制化模块和百敖特定功能模块(Setup界面,USB等等)。
CryptoPkg: 提供了供UEFI安全功能模块使用的密码算法相关库函数,以及用于测试库函数的测试应用程序。
ExtPkg: 提供了访问linux ext2~4分区格式的文件系统驱动。
FatBinPkg: 提供了针对不同CPU架构的FAT驱动二进制文件。
IntelFrameworkPkg:声明了Intel Platform Innovation Framework Specification(http://developer.intel/technology/framework/spec.htm)中定义的PROTOCOLs, PPIs, GUIDs和相关数据结构。另外,这个package还包括了基于Intel Platform Innovation Framework Specification的库函数实例(Library Instances)。
IntelFrameworkModulePkg:提供了基于Intel Platform Innovation Framework Specification的一组跨平台通用库函数实例和模块,以及服务于这些模块的库函数实例。
MdePkg:用来声明在UEFI、EFI、PI规范和行业标准中定义的协议栈、PPIs、GUIDs 和相关数据结构体。此外,这个包还为英特尔创新平台固件提供了 MdeModulePkg中定义的库实体服务程序。
MdeModulePkg:提供了一组基于UEFI、EFI和PI规范的跨平台的模块。并且它还包括这些模块的库实体。
PhytiumPkg:飞腾平台客户一些定制化功能一般在本文件夹中添加。
SecurityPkg:为UEFI安全模块提供安全相关的驱动。
ShellPkg: 提供了UEFI shell源代码,可用于编译生成UEFI shell二进制文件。
ShellBinPkg:提供了针对不同CPU架构的UEFI shell和shell应用程序二进制文件。
UefiCpuPkg:提供了UEFI兼容的CPU初始化模块和库函数。
三、代码编译过程介绍
3.1 编译所需开发工具
飞腾平台需要在ARM环境下编译或者在虚拟机里面用交叉编译环境编译。
3.2 编译环境搭建
3.2.1 安装VMware (版本没有要求)
在VMware下安装Ubuntu(64 位ubuntu需要把BIOS SETUP中的CPU的VT打开)安装时选择默认路径
参考文档:
http://wenku.baidu/link?url=eTUlDof-qCa2QKKyxjJqXGz80XAQOjLghgf0tnZG3BBW8Xiu_3xyglRgr0YQpZpNRNWauny6i6dw4bevB2MkUOyuK2zHCvJHJITssFpAHim
3.2.2 搭建编译环境
1. 解压gcc文件
将下图所示tool拷贝到Linux相应文件夹下解压附件。
2.设置tool路径:
Code文件下的build.sh文件里面有一条
export PATH=$PATH:/home/xuxiaoyue/share/tool/aarch64-toolchain/gcc-linaro-aarch64-linux-gnu-4.9-2014.08_linux/bin
请依自己的文件目录(即上述步骤解压存放路径)进行修改
3. 安装acpica编译ACPI table工具,工具下载地址如下:
https://acpica/downloads
下载后编译进行安装。
4. 编译code
将code拷贝到虚拟机的相应路径下,在终端先输入语句chmod +x build.sh,修改文件权限;
执行./build.sh init,初始化编译环境;
执行命令./ build.sh d/r (d为debug版本,r为release版本)就可以build出一版bios了,生成的BIOS在文件根目录下,后缀名为*.fd。
PS:第一和第二步只需要执行一次,但是若是一个新的code或更改了文件名,则需再次执行./build.sh init。
./build.sh init:初始化编译环境
./ build.sh d:编译生成debug版本BIOS
./ build.sh r:编译生成release版本BIOS
./ build.sh clean:清除编译信息
5.搭建编译环境常见问题:
1) aarch64-linux-gnu-gcc找不到
这个是因为此文件为32位程序,而我装的是64位系统,所以需要安装一个在64位系统下运行32位系统的程式。终端输入如下命令:
sudodpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
sudo ./adb
参考文档:http://blog.csdn/ageme/article/details/26969575
2) libz.so.1找不到
这个需要安装程式,终端输入如下命令:
sudo apt-get install lib32z1
参考文档:http://www.linuxdiyf/linux/13257.html
3) 找不到uuid.h
终端输入如下命令:
sudo apt-get install uuid-dev
四、代码开机流程介绍
4.1UEFI bios开机流程简介
如上图所示,UEFI架构的平台开机由POWERON开始经历SEC、PEI、DXE、BDS、OS Loader以及RUNTIME阶段。具体的细节可以参开UEFI的PI Spec。
SEC(安全验证)-> PEI(EFI前期初始化)-> DXE(驱动执行环境)
-> BDS(启动设备选择)-> TSL(操作系统加载前期) -> RT(Run time) -> AL(系统灾难恢复期)
前三个阶段是UEFI初始化阶段,DXE阶段结束后UEFI环境已准备完毕。BDS和TSL是操作系统加载器作为UEFI应用程序运行阶段。
操作系统加载器调用ExitBootServices()服务后进入RT阶段,RT阶段包括操作系统加载器后期和操作系统运行期。
当系统硬件或操作系统出现严重错误不能继续正常运行时,固件尝试修复错误,这时系统进入AL期。
UEFI定义了操作系统和平台固件之间的接口。UEFI接口可分为启动服务(Runtime Services)和运行时服务(Boot Services)。启动服务和运行时服务只有在系统进入DXE阶段后才生成。
值得注意的是,飞腾平台有别于x86平台,并不包含PEI阶段,且平台资源分配的工作很多都是在pbf头文件中完成的,开机后会先执行pbf头文件,再去跑BIOS,下面对飞腾平台BIOS的三个阶段进行介绍。
4.2 SEC
SEC(Security Phase)阶段是平台初始化的第一个阶段,计算机系统加电后进入这个阶段。
SecCore的作用:
需用Assembly做一些C无法处理的工作
C语言无法处理CPU的特殊寄存器;
C语言需要Memory来作为函数调用的栈。
SEC阶段做什么
接收并处理系统启动和重启信号
交接给C环境
a)进入protected mode
b)提供C环境所需Stack
c)传递系统参数给DXE,比如系统当前状态,可启动固件,RAM地址和大小,Stack地址和大小等等
启用所有核心的指令缓存
SEC具体流程
\ArmPlatformPkg\PrePi\PrePi.c
ArmPlatformInitialize
ArmDisableDataCache
ArmInvalidateDataCache
ArmInvalidateInstructionCache
ArmEnableInstructionCache
4.3 DXE
DXE阶段做什么
Run 所有的DXE Driver, 使其这个阶段Ready.
Binding driver先挂到系统上,实际connect device在BDS阶段
启动BDS
DXE执行流程
DXE阶段执行大部分系统初始化工作,进入此阶段时,内存已经被完全使用,可进行大量复杂工作
从功能上讲DXE分为两部分
DXE core,负责DXE基础服务和流程
DXE dispatcher,负责调度执行DXE驱动,初始化系统设备
DXE提供的基础服务包括SystemTable, BootServices, Run Time Services
DXE具体流程
\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
//初始化系统服务
\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
//调度系统中的Driver
Debug信息:” Loading driver XXXX”
\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
//传递控制权到BDS,从本质上讲,BDS是一种特殊的DXE阶段的应用程序
REPORT_STATUS_CODE:0x90
4.4 BDS
BDS阶段做什么
初始化控制台设备
加载必要的设备驱动
选择并执行启动项或者进入SETUP
BDS具体流程
MdeModulePkg\Universal\BdsDxe\BdsEntry.c
//BDS入口
// 做一些平台初始化
// 初始化hotkey service
// Connect all default consoles
// After consoles, show logo & connect all
//等待一定时间,若无按键则从默认设备启动
五、OEM Porting
5.1更换pbf头文件
不同平台由于硬件的不同,所以需包入适配于该板子的pbf头文件。
将pbf相应的头文件放入\ PhytiumPkg\pbf\文件夹中然后修改build.sh里面对应的文件名为新的pbf文件名即可。
5.2更换logo
将\PhytiumPkg\PhytiumPkg.fdf文件中的红框中的名字修改为要替换的logo文件名,并将logo放在PhytiumPkg\Logo\文件夹中。
支持的图片类型仅为.bmp和.jpg格式,分辨率最大支持1024*768。
5.3 更换驱动文件
以下图中三个驱动为例
AMDGOP:AMD显卡驱动。飞腾平台仅支持UEFI驱动,所以此处包的是显卡的GOP驱动,但是AMD显卡需板载上包含VBIOS(可x86平台的),因为GOP驱动会从VBIOS驱动中获取部分关于显卡的table信息。
ASPEED_2400:ASPEED 2400显卡驱动。有别于AMD显卡驱动,此处显卡驱动不依赖于VBIOS。uefi_2400_396.depex为该驱动的dependency,只有该dependency满足的时候,这只驱动才会跑起来。下面对该dependency进行描述:
由上面几幅图可以看出,uefi_2400_396.depex的dependency对应的是gAspeedGopDepexGuid,再从code中可以看出,当没有找到AMD显卡时,才会installgAspeedGopDepexGuid,后面该显卡驱动才会跑起来,程序如下图。目的是为了有外插显卡时优先使用外插显卡,无外插显卡时再去使用BMC板载显卡。添加原因是:为了解决在进麒麟操作系统后的双显卡显示问题。
GigUndiDxe:Intel网卡驱动。GigUndiDxe.depex为该驱动的dependency,只有该dependency满足的时候,这只驱动才会跑起来。下面对该dependency进行描述:
由上面几幅图可以看出,GigUndiDxe.depex的dependency对应的是gIntelUndiDepexGuid,再从code中可以看出,当网络引导打开时,才会installgIntelUndiDepexGuid,即只有当打开网络引导选项时,intel网卡驱动才会跑起来code中的实现见下图。目的是为了从软件方面实现对intel网卡的打开和关闭。
5.4 如何添加新的驱动模块
每个驱动文件最起码包含一个.inf文件及一个.c文件,具体可参考“DxeDriver参考.rar”。.inf文件用于定义你的驱动类型,用到的libraryclasses等,关于.inf文件的详细描述详见文档第二章。.c文件用于编写你的程序实现。
若该驱动模块仅用于编译生成.efi文件,则只需将该驱动的.inf文件路径定义在Phytium1500aPkg.dsc文件中[Componentsmon]模块下,如下图一所示。但若需要包进BIOS中,则需要将.inf文件文件路径定义在Phytium1500aPkg.fdf文件的对应位置,如下图二。若本模块需包含未定义的LibraryClasses,则需在Phytium1500aPkg.dsc文件中定义LibraryClasses的路径,如图三。
【DXE_DRIVER与UEFI_DRIVER的区别】:
- DXE_DRIVER只要load到内存里面后,只要Depex满足或为TRUE,如图,就会立即执行它的ENTRY_POINT;
-
UEFI_DRIVER在load到内存后,Depex满足或为TRUE后虽然也会执行它的ENTRY_POINT,但是它的ENTRY_POINT函数只会去Install EFI Driver Binding Protocol,如图。一个标准的Driver Binding包括supported,start,stop3个成员函数。BDS在调用ConnectCOntroller时,会把每个UEFI_DRIVER的supported都执行一遍,当supported满足时,才会去跑start函数,只有当start函数跑起来时,这支UEFI_DRIVER才是真的起作用。Stop为卸载该驱动。
5.5 如何添加新的setup选项
Setup选项的添加与删减基本在\PhytiumPkg\PlatformSetupDxe\文件夹中进行相应修改。以下以server平台上添加SATA Port选项为例,具体说明。
1.在对应界面的.vfr文件中添加需要添加的选项。SATA port选项添加在高级界面(即Advance),找到文件\PhytiumPkg\PlatformSetupDxe\Advanced\FormsetAdvanced.vfr,添加图中字段。此处添加的是文本格式的选项,不同类型选项的说明,详见下面的“VFR.pdf”spec。
2.在.uni文件中对string进行定义。如图一,在setup.uni文件中,对添加的4个port的字符串赋值。若是固定的名称,则只需将对应名称写入;若是像SATA port一样,需动态显示其名称,则需要在.c文件中进行赋值,如图二。
3.若定义的是下图一类型的,且需要default值的,如图。
六、定制BIOS setup 界面,callback实现
6.1定制Bios Setup界面
相关module PlatformPkg\PlatformSetupDxe
下面有文件目录分别对应SETUP界面里的选项卡:Advanced device Exit Main power Security。
以Exit选项卡为例:
formset guid = EXIT_FORM_SET_GUID, //定义一个表的容器formset
title = STRING_TOKEN(STR_EXIT),
help = STRING_TOKEN(STR_EXIT_HELP),
classguid = EFI_IFR_FRONT_PAGE_GUID,
class = EXIT_FORM_SET_CLASS,
subclass = 0,
form formid = 1, //定义一个表form
title = STRING_TOKEN(STR_EXIT);
text
help = STRING_TOKEN(STR_SAVE_EXIT_HELP),
text = STRING_TOKEN(STR_SAVE_EXIT),
flags = INTERACTIVE | RESET_REQUIRED,
key = AUTO_ID(KEY_SAVE_AND_EXIT_VALUE);
formset 和form 的定义规则参见HII spec。一个formset 可以容纳多个form。
这里定义了一个text 格式的表,表所显示的帮助信息(STR_SAVE_EXIT_HELP),名字(STR_SAVE_EXIT)可以从Setup.uni文件中查到为:Exit system Setup after saving the changes.
6.2 callback 原理
这个form 在setup界面下会根据用户选择对相应函数实现callback。
如当我们选择保存并退出时就会调用ExitFormCallback函数,根据回调时的参数来执行具体的任务。保存退出时的KeyValue是KEY_SAVE_AND_EXIT_VALUE。通过switch case 执行相应的代码。
FT-2000/4芯片集成4个飞腾自主研发的新一代高性能处理器内核FTC663,采用乱序四发射超标量流水线,兼容64位ARMV8指令集并支持ARM64和ARM32两种执行模式,支持单精度、双精度浮点运算指令和ASIMD处理指令,支持硬件虚拟化。
FT-2000/4从硬件层面增强了芯片的安全性,支持飞腾自主定义的处理器安全架构标准PSPA 1.0,满足更复杂应用场景下对性能和安全可信的需求。
该产品适用于构建有更高性能、能耗比和安全需要的桌面终端、便携式终端、轻量级服务器和嵌入式低功耗产品,支持商业和工业分级。 [1]
主要技术参数:
处理器内核 | FTC663 |
核数 | 4 |
主频 | 2.2GHz、2.6GHz |
一级缓存 | 32KB数据缓存,32KB指令缓存 |
二级缓存 | 4MB |
三级缓存 | 4MB |
片上存储器 | 集成128KB片上存储 |
存储控制器 | 2个DDR4接口,支持DDR存储数据实时加密,兼容DDR3、DDR3L |
PCIE接口 | 2个x16(每个可分拆为2个x8)和2个x1 PCIE 3.0接口 |
网络接口 | 2个10/100/1000Mbps自适应以太网接口 |
其他接口 | 1个SD 2.0,1个HD-Audio,4个UART,32个GPIO,1个LPC,4个I2C,1个QSPI接Flash,2个通用SPI,2个WDT,3个CAN 2.0 |
安全技术 | 支持PSPA安全标准1.0,支持基于域隔离的安全机制,集成ROM作为可信启动根,集成多种密码加速引擎 |
低功耗技术 | 支持电源关断、时钟关断、DVFS以及关核、降频操作,支持待机、休眠模式 |
典型功耗 | 40W |
封装 | FCBGA,引脚个数1144 |
尺寸 | 35mm x 35mm |
一、产品简介
1.1 产品描述
作为百敖的旗舰产品,飞腾 UEFI BIOS基于UEFI EDK II规范,经过严格的开发及测试流程,应用了最新的UEFI标准,采用模块化设计,可以很容易的移植到不同的平台,包括服务器,台式机,笔记本,移动设备,嵌入式设备等。相比较传统的BIOS,UEFI BIOS基于UEFI标准,能够提供更大的灵活性,在预启动环境可以完成更多的工作。
百敖飞腾 UEFI BIOS针对飞腾FT2000处理器进行了升级,全面支持飞腾FT2000平台,飞腾UEFI BIOS基于飞腾CRB(客户参考板)进行开发,在支持FT2000公板平台的基础上增加了很多百敖的特定功能,满足各种应用场景的要求,并且根据OEM/ODM的需要提供定制化服务,帮助客户迅速开发产品。
百敖软件创立于 2006 年,是领先的固件供应商及软件服务提供商,公司产品涵盖 UEFI BIOS、BMC、EC 及配套工具,支持多种芯片架构(包括 X86、Arm、MIPS、Alpha 等),广泛应用于 PC、服务器、物联网、工控、消费等领域。
1.2主要功能
飞腾UEFI BIOS 飞腾FT2000版本支持以下主要功能:
UEFI及平台功能
支持UEFI 2.5及PI 1.2标准
支持飞腾FT2000+处理器
支持Linux/UEFI Shell
高级功能
快速启动
多语言支持(中文/英文)
Boot功能
硬盘模式启动
光驱模式启动
USB模式启动
网络模式启动
支持热键
BIOS管理
BIOS Setup下固件更新功能
启动信息支持串口输出
密码管理
管理员密码
开机密码
控制重定向功能
支持串口的控制重定向功能
显卡
HD5450 7450 7470 7750 8450 8470
E6460 E6465 E6760
R5340 R5235 R7240及SM750、SM768
BMC里显卡支持列表:Aspeed 2400/2500
ATA/ATAPI功能
支持SATA AHCI模式
USB功能
支持USB1.0/2.0/3.0
POST阶段/UEFI Shell环境下支持USB键盘鼠标热插拔
Video
板载Video
支持UEFI模式下的显卡
Debug支持
COM口调试支持
内存配置
Memory Topology Detection and Display
Memory Operating Speed Display
内存大小
PCI/PCI-e
支持PCI 2.3
支持PCI-X
PCI FW 3.0
PCI-e 1.1/2.0
二、 基础代码架构与文件目录介绍
2.1 代码基础结构及文件目录
飞腾FT2000+ BIOS使用UEFI构架,Code有99%的C代码和极少量的汇编代码组合而成。由INF文件和源文件(c、汇编等)组成一个个模块,定义在一个DEC文件描述包内,最后由平台文件DSC和FDF来选择参与编译和最终包含进BIOS的模块。
2.2 主要的Package介绍
主要package简介如下。
ArmPkg:提供了ARM平台硬件相关模块,如GIC、CPU、Timer以及ARM指令集。
ArmPlatformPkg:提供ARM平台相关的驱动模块,如Flash、GPIO等。
BaseTools: 提供了BIOS编译的二进制可执行工具,以及BIOS编译的配置文件模板。
ByoModulePkg: 提供了百敖定制化模块和百敖特定功能模块(Setup界面,USB等等)。
CryptoPkg: 提供了供UEFI安全功能模块使用的密码算法相关库函数,以及用于测试库函数的测试应用程序。
ExtPkg: 提供了访问linux ext2~4分区格式的文件系统驱动。
FatBinPkg: 提供了针对不同CPU架构的FAT驱动二进制文件。
IntelFrameworkPkg:声明了Intel Platform Innovation Framework Specification(http://developer.intel/technology/framework/spec.htm)中定义的PROTOCOLs, PPIs, GUIDs和相关数据结构。另外,这个package还包括了基于Intel Platform Innovation Framework Specification的库函数实例(Library Instances)。
IntelFrameworkModulePkg:提供了基于Intel Platform Innovation Framework Specification的一组跨平台通用库函数实例和模块,以及服务于这些模块的库函数实例。
MdePkg:用来声明在UEFI、EFI、PI规范和行业标准中定义的协议栈、PPIs、GUIDs 和相关数据结构体。此外,这个包还为英特尔创新平台固件提供了 MdeModulePkg中定义的库实体服务程序。
MdeModulePkg:提供了一组基于UEFI、EFI和PI规范的跨平台的模块。并且它还包括这些模块的库实体。
PhytiumPkg:飞腾平台客户一些定制化功能一般在本文件夹中添加。
SecurityPkg:为UEFI安全模块提供安全相关的驱动。
ShellPkg: 提供了UEFI shell源代码,可用于编译生成UEFI shell二进制文件。
ShellBinPkg:提供了针对不同CPU架构的UEFI shell和shell应用程序二进制文件。
UefiCpuPkg:提供了UEFI兼容的CPU初始化模块和库函数。
三、代码编译过程介绍
3.1 编译所需开发工具
飞腾平台需要在ARM环境下编译或者在虚拟机里面用交叉编译环境编译。
3.2 编译环境搭建
3.2.1 安装VMware (版本没有要求)
在VMware下安装Ubuntu(64 位ubuntu需要把BIOS SETUP中的CPU的VT打开)安装时选择默认路径
参考文档:
http://wenku.baidu/link?url=eTUlDof-qCa2QKKyxjJqXGz80XAQOjLghgf0tnZG3BBW8Xiu_3xyglRgr0YQpZpNRNWauny6i6dw4bevB2MkUOyuK2zHCvJHJITssFpAHim
3.2.2 搭建编译环境
1. 解压gcc文件
将下图所示tool拷贝到Linux相应文件夹下解压附件。
2.设置tool路径:
Code文件下的build.sh文件里面有一条
export PATH=$PATH:/home/xuxiaoyue/share/tool/aarch64-toolchain/gcc-linaro-aarch64-linux-gnu-4.9-2014.08_linux/bin
请依自己的文件目录(即上述步骤解压存放路径)进行修改
3. 安装acpica编译ACPI table工具,工具下载地址如下:
https://acpica/downloads
下载后编译进行安装。
4. 编译code
将code拷贝到虚拟机的相应路径下,在终端先输入语句chmod +x build.sh,修改文件权限;
执行./build.sh init,初始化编译环境;
执行命令./ build.sh d/r (d为debug版本,r为release版本)就可以build出一版bios了,生成的BIOS在文件根目录下,后缀名为*.fd。
PS:第一和第二步只需要执行一次,但是若是一个新的code或更改了文件名,则需再次执行./build.sh init。
./build.sh init:初始化编译环境
./ build.sh d:编译生成debug版本BIOS
./ build.sh r:编译生成release版本BIOS
./ build.sh clean:清除编译信息
5.搭建编译环境常见问题:
1) aarch64-linux-gnu-gcc找不到
这个是因为此文件为32位程序,而我装的是64位系统,所以需要安装一个在64位系统下运行32位系统的程式。终端输入如下命令:
sudodpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
sudo ./adb
参考文档:http://blog.csdn/ageme/article/details/26969575
2) libz.so.1找不到
这个需要安装程式,终端输入如下命令:
sudo apt-get install lib32z1
参考文档:http://www.linuxdiyf/linux/13257.html
3) 找不到uuid.h
终端输入如下命令:
sudo apt-get install uuid-dev
四、代码开机流程介绍
4.1UEFI bios开机流程简介
如上图所示,UEFI架构的平台开机由POWERON开始经历SEC、PEI、DXE、BDS、OS Loader以及RUNTIME阶段。具体的细节可以参开UEFI的PI Spec。
SEC(安全验证)-> PEI(EFI前期初始化)-> DXE(驱动执行环境)
-> BDS(启动设备选择)-> TSL(操作系统加载前期) -> RT(Run time) -> AL(系统灾难恢复期)
前三个阶段是UEFI初始化阶段,DXE阶段结束后UEFI环境已准备完毕。BDS和TSL是操作系统加载器作为UEFI应用程序运行阶段。
操作系统加载器调用ExitBootServices()服务后进入RT阶段,RT阶段包括操作系统加载器后期和操作系统运行期。
当系统硬件或操作系统出现严重错误不能继续正常运行时,固件尝试修复错误,这时系统进入AL期。
UEFI定义了操作系统和平台固件之间的接口。UEFI接口可分为启动服务(Runtime Services)和运行时服务(Boot Services)。启动服务和运行时服务只有在系统进入DXE阶段后才生成。
值得注意的是,飞腾平台有别于x86平台,并不包含PEI阶段,且平台资源分配的工作很多都是在pbf头文件中完成的,开机后会先执行pbf头文件,再去跑BIOS,下面对飞腾平台BIOS的三个阶段进行介绍。
4.2 SEC
SEC(Security Phase)阶段是平台初始化的第一个阶段,计算机系统加电后进入这个阶段。
SecCore的作用:
需用Assembly做一些C无法处理的工作
C语言无法处理CPU的特殊寄存器;
C语言需要Memory来作为函数调用的栈。
SEC阶段做什么
接收并处理系统启动和重启信号
交接给C环境
a)进入protected mode
b)提供C环境所需Stack
c)传递系统参数给DXE,比如系统当前状态,可启动固件,RAM地址和大小,Stack地址和大小等等
启用所有核心的指令缓存
SEC具体流程
\ArmPlatformPkg\PrePi\PrePi.c
ArmPlatformInitialize
ArmDisableDataCache
ArmInvalidateDataCache
ArmInvalidateInstructionCache
ArmEnableInstructionCache
4.3 DXE
DXE阶段做什么
Run 所有的DXE Driver, 使其这个阶段Ready.
Binding driver先挂到系统上,实际connect device在BDS阶段
启动BDS
DXE执行流程
DXE阶段执行大部分系统初始化工作,进入此阶段时,内存已经被完全使用,可进行大量复杂工作
从功能上讲DXE分为两部分
DXE core,负责DXE基础服务和流程
DXE dispatcher,负责调度执行DXE驱动,初始化系统设备
DXE提供的基础服务包括SystemTable, BootServices, Run Time Services
DXE具体流程
\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
//初始化系统服务
\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
//调度系统中的Driver
Debug信息:” Loading driver XXXX”
\MdeModulePkg\Core\Dxe\DxeMain\DxeMain.c
//传递控制权到BDS,从本质上讲,BDS是一种特殊的DXE阶段的应用程序
REPORT_STATUS_CODE:0x90
4.4 BDS
BDS阶段做什么
初始化控制台设备
加载必要的设备驱动
选择并执行启动项或者进入SETUP
BDS具体流程
MdeModulePkg\Universal\BdsDxe\BdsEntry.c
//BDS入口
// 做一些平台初始化
// 初始化hotkey service
// Connect all default consoles
// After consoles, show logo & connect all
//等待一定时间,若无按键则从默认设备启动
五、OEM Porting
5.1更换pbf头文件
不同平台由于硬件的不同,所以需包入适配于该板子的pbf头文件。
将pbf相应的头文件放入\ PhytiumPkg\pbf\文件夹中然后修改build.sh里面对应的文件名为新的pbf文件名即可。
5.2更换logo
将\PhytiumPkg\PhytiumPkg.fdf文件中的红框中的名字修改为要替换的logo文件名,并将logo放在PhytiumPkg\Logo\文件夹中。
支持的图片类型仅为.bmp和.jpg格式,分辨率最大支持1024*768。
5.3 更换驱动文件
以下图中三个驱动为例
AMDGOP:AMD显卡驱动。飞腾平台仅支持UEFI驱动,所以此处包的是显卡的GOP驱动,但是AMD显卡需板载上包含VBIOS(可x86平台的),因为GOP驱动会从VBIOS驱动中获取部分关于显卡的table信息。
ASPEED_2400:ASPEED 2400显卡驱动。有别于AMD显卡驱动,此处显卡驱动不依赖于VBIOS。uefi_2400_396.depex为该驱动的dependency,只有该dependency满足的时候,这只驱动才会跑起来。下面对该dependency进行描述:
由上面几幅图可以看出,uefi_2400_396.depex的dependency对应的是gAspeedGopDepexGuid,再从code中可以看出,当没有找到AMD显卡时,才会installgAspeedGopDepexGuid,后面该显卡驱动才会跑起来,程序如下图。目的是为了有外插显卡时优先使用外插显卡,无外插显卡时再去使用BMC板载显卡。添加原因是:为了解决在进麒麟操作系统后的双显卡显示问题。
GigUndiDxe:Intel网卡驱动。GigUndiDxe.depex为该驱动的dependency,只有该dependency满足的时候,这只驱动才会跑起来。下面对该dependency进行描述:
由上面几幅图可以看出,GigUndiDxe.depex的dependency对应的是gIntelUndiDepexGuid,再从code中可以看出,当网络引导打开时,才会installgIntelUndiDepexGuid,即只有当打开网络引导选项时,intel网卡驱动才会跑起来code中的实现见下图。目的是为了从软件方面实现对intel网卡的打开和关闭。
5.4 如何添加新的驱动模块
每个驱动文件最起码包含一个.inf文件及一个.c文件,具体可参考“DxeDriver参考.rar”。.inf文件用于定义你的驱动类型,用到的libraryclasses等,关于.inf文件的详细描述详见文档第二章。.c文件用于编写你的程序实现。
若该驱动模块仅用于编译生成.efi文件,则只需将该驱动的.inf文件路径定义在Phytium1500aPkg.dsc文件中[Componentsmon]模块下,如下图一所示。但若需要包进BIOS中,则需要将.inf文件文件路径定义在Phytium1500aPkg.fdf文件的对应位置,如下图二。若本模块需包含未定义的LibraryClasses,则需在Phytium1500aPkg.dsc文件中定义LibraryClasses的路径,如图三。
【DXE_DRIVER与UEFI_DRIVER的区别】:
- DXE_DRIVER只要load到内存里面后,只要Depex满足或为TRUE,如图,就会立即执行它的ENTRY_POINT;
-
UEFI_DRIVER在load到内存后,Depex满足或为TRUE后虽然也会执行它的ENTRY_POINT,但是它的ENTRY_POINT函数只会去Install EFI Driver Binding Protocol,如图。一个标准的Driver Binding包括supported,start,stop3个成员函数。BDS在调用ConnectCOntroller时,会把每个UEFI_DRIVER的supported都执行一遍,当supported满足时,才会去跑start函数,只有当start函数跑起来时,这支UEFI_DRIVER才是真的起作用。Stop为卸载该驱动。
5.5 如何添加新的setup选项
Setup选项的添加与删减基本在\PhytiumPkg\PlatformSetupDxe\文件夹中进行相应修改。以下以server平台上添加SATA Port选项为例,具体说明。
1.在对应界面的.vfr文件中添加需要添加的选项。SATA port选项添加在高级界面(即Advance),找到文件\PhytiumPkg\PlatformSetupDxe\Advanced\FormsetAdvanced.vfr,添加图中字段。此处添加的是文本格式的选项,不同类型选项的说明,详见下面的“VFR.pdf”spec。
2.在.uni文件中对string进行定义。如图一,在setup.uni文件中,对添加的4个port的字符串赋值。若是固定的名称,则只需将对应名称写入;若是像SATA port一样,需动态显示其名称,则需要在.c文件中进行赋值,如图二。
3.若定义的是下图一类型的,且需要default值的,如图。
六、定制BIOS setup 界面,callback实现
6.1定制Bios Setup界面
相关module PlatformPkg\PlatformSetupDxe
下面有文件目录分别对应SETUP界面里的选项卡:Advanced device Exit Main power Security。
以Exit选项卡为例:
formset guid = EXIT_FORM_SET_GUID, //定义一个表的容器formset
title = STRING_TOKEN(STR_EXIT),
help = STRING_TOKEN(STR_EXIT_HELP),
classguid = EFI_IFR_FRONT_PAGE_GUID,
class = EXIT_FORM_SET_CLASS,
subclass = 0,
form formid = 1, //定义一个表form
title = STRING_TOKEN(STR_EXIT);
text
help = STRING_TOKEN(STR_SAVE_EXIT_HELP),
text = STRING_TOKEN(STR_SAVE_EXIT),
flags = INTERACTIVE | RESET_REQUIRED,
key = AUTO_ID(KEY_SAVE_AND_EXIT_VALUE);
formset 和form 的定义规则参见HII spec。一个formset 可以容纳多个form。
这里定义了一个text 格式的表,表所显示的帮助信息(STR_SAVE_EXIT_HELP),名字(STR_SAVE_EXIT)可以从Setup.uni文件中查到为:Exit system Setup after saving the changes.
6.2 callback 原理
这个form 在setup界面下会根据用户选择对相应函数实现callback。
如当我们选择保存并退出时就会调用ExitFormCallback函数,根据回调时的参数来执行具体的任务。保存退出时的KeyValue是KEY_SAVE_AND_EXIT_VALUE。通过switch case 执行相应的代码。