23,211
社区成员




作为百敖的旗舰产品,飞腾 UEFI BIOS基于UEFI EDK II规范,经过严格的开发及测试流程,应用了最新的UEFI标准,采用模块化设计,可以很容易的移植到不同的平台,包括服务器,台式机,笔记本,移动设备,嵌入式设备等。相比较传统的BIOS,UEFI BIOS基于UEFI标准,能够提供更大的灵活性,在预启动环境可以完成更多的工作。
百敖飞腾 UEFI BIOS针对飞腾FT2000处理器进行了升级,全面支持飞腾FT2000平台,飞腾UEFI BIOS基于飞腾CRB(客户参考板)进行开发,在支持FT2000公板平台的基础上增加了很多百敖的特定功能,满足各种应用场景的要求,并且根据OEM/ODM的需要提供定制化服务,帮助客户迅速开发产品。
飞腾UEFI BIOS 飞腾FT2000版本支持以下主要功能:
飞腾FT2000+ BIOS使用UEFI构架,Code有99%的C代码和极少量的汇编代码组合而成。由INF文件和源文件(c、汇编等)组成一个个模块,定义在一个DEC文件描述包内,最后由平台文件DSC和FDF来选择参与编译和最终包含进BIOS的模块。
主要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.com/technology/framework/spec.htm)%E4%B8%AD%E5%AE%9A%E4%B9%89%E7%9A%84PROTOCOLs, 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初始化模块和库函数。
飞腾平台需要在ARM环境下编译或者在虚拟机里面用交叉编译环境编译。
在VMware下安装Ubuntu(64 位ubuntu需要把BIOS SETUP中的CPU的VT打开)安装时选择默认路径
参考文档:
http://wenku.baidu.com/link?url=eTUlDof-qCa2QKKyxjJqXGz80XAQOjLghgf0tnZG3BBW8Xiu_3xyglRgr0YQpZpNRNWauny6i6dw4bevB2MkUOyuK2zHCvJHJITssFpAHim
将下图所示tool拷贝到Linux相应文件夹下解压附件。
Code文件下的build.sh文件里面有一条
export PATH=$PATH:/home/xuxiaoyue/share/tool/aarch64-toolchain/gcc-linaro-aarch64-linux-gnu-4.9-2014.08_linux/bin
请依自己的文件目录(即上述步骤解压存放路径)进行修改
https://acpica.org/downloads
下载后编译进行安装
将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:清除编译信息
这个是因为此文件为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.net/ageme/article/details/26969575
这个需要安装程式,终端输入如下命令:
sudo apt-get install lib32z1
参考文档:http://www.linuxdiyf.com/linux/13257.html
终端输入如下命令:
sudo apt-get install uuid-dev
BDS(启动设备选择)-> TSL(操作系统加载前期) -> RT(Run time) -> AL(系统灾难恢复期)
值得注意的是,飞腾平台有别于x86平台,并不包含PEI阶段,且平台资源分配的工作很多都是在pbf头文件中完成的,开机后会先执行pbf头文件,再去跑BIOS,下面对飞腾平台BIOS的三个阶段进行介绍。
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
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
//调度系统中的Driver
REPORT_STATUS_CODE:0x90
BDS阶段做什么
初始化控制台设备
加载必要的设备驱动
选择并执行启动项或者进入SETUP
BDS具体流程
MdeModulePkg\Universal\BdsDxe\BdsEntry.c
//BDS入口
// After consoles, show logo & connect all
不同平台由于硬件的不同,所以需包入适配于该板子的pbf头文件。
将pbf相应的头文件放入\ PhytiumPkg\pbf\文件夹中然后修改build.sh里面对应的文件名为新的pbf文件名即可。
将\PhytiumPkg\PhytiumPkg.fdf文件中的红框中的名字修改为要替换的logo文件名,并将logo放在PhytiumPkg\Logo\文件夹中。
支持的图片类型仅为.bmp和.jpg格式,分辨率最大支持1024*768。
以下图中三个驱动为例
ASPEED_2400:ASPEED 2400显卡驱动。有别于AMD显卡驱动,此处显卡驱动不依赖于VBIOS。uefi_2400_396.depex为该驱动的dependency,只有该dependency满足的时候,这只驱动才会跑起来。下面对该dependency进行描述:
每个驱动文件最起码包含一个.inf文件及一个.c文件,具体可参考“DxeDriver参考.rar”。.inf文件用于定义你的驱动类型,用到的libraryclasses等,关于.inf文件的详细描述详见文档第二章。.c文件用于编写你的程序实现。
若该驱动模块仅用于编译生成.efi文件,则只需将该驱动的.inf文件路径定义在Phytium1500aPkg.dsc文件中[Components.common]模块下,如下图一所示。但若需要包进BIOS中,则需要将.inf文件文件路径定义在Phytium1500aPkg.fdf文件的对应位置,如下图二。若本模块需包含未定义的LibraryClasses,则需在Phytium1500aPkg.dsc文件中定义LibraryClasses的路径,如图三。
【DXE_DRIVER与UEFI_DRIVER的区别】:
Setup选项的添加与删减基本在\PhytiumPkg\PlatformSetupDxe\文件夹中进行相应修改。以下以server平台上添加SATA Port选项为例,具体说明。
1.在对应界面的.vfr文件中添加需要添加的选项。SATA port选项添加在高级界面(即Advance),找到文件\PhytiumPkg\PlatformSetupDxe\Advanced\FormsetAdvanced.vfr,添加图中字段。此处添加的是文本格式的选项,不同类型选项的说明,详见下面的“VFR.pdf”spec。
3.若定义的是下图一类型的,且需要default值的,如图。
相关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.
这个form 在setup界面下会根据用户选择对相应函数实现callback。
如当我们选择保存并退出时就会调用ExitFormCallback函数,根据回调时的参数来执行具体的任务。保存退出时的KeyValue是KEY_SAVE_AND_EXIT_VALUE。通过switch case 执行相应的代码。