UEFI原理与编程实践--FDF文件

实际书籍中并没有讲这一块的,不过这块还是挺重要的,因为很多人一看fdf文件就很懵,不知道细节的可以说完全看不懂,FDF文件是什么,说的直白一点,就是盖房子的设计图,fdf说编译器来,你给我输出一个这样层次的FD文件,这个FD文件就是大家经常烧录的BIOS固件。

FD:固件设备,可以转化为BIN文件,熟悉的OVMF.FD就是典型代表

FV:固件卷,说固件卷很难懂的话,直接说固件块总行吧,就是FD被切割成了一块一块的,这一块一块的就是固件卷

目前先主要说FV吧,FD知道概念就行

FV

啥是FV啊,FV就是固件卷,那究竟什么又是固件卷啊,说白了,就是存放某个阶段的所有image,这个咋说呢,比如一个DXE driver,最终编译会生成一个.efi,其实这个.efi就保存在一个固件卷中,而这个固件卷保存所有DXE阶段产生的.efi,这个就和UEFI的名字联系起来了(题外话)UEFI:统一可拓展固件接口,它的模块化我觉得就在于此,整个BIOS文件就是多个.efi可执行文件的集合体,先把流水线建好,然后约好了,你先走这个.efi,然后再走那个.efi。。。

玩BIOS的,经常看到开机的时候有个logo,当初做新手换个logo觉得很神奇,但是不知道怎么加载的,其实,这个就是个可视化的FV(当然如果fdf文件不包含logo FV的话也有另外的加载方式,这个另当别论),一张图片作为数据被保存在一个独有的固件卷中,在开机的时候,再把它找到,解析出来显示,就是大家看到的logo啦。

看一下FV的格式,找一张没侵权的吧,这个应该是通用的:

0x00020000|0x00020000

#gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase|gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize

DATA = {

  # ZeroVector []

  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

  # FileSystemGuid

  0x8D, 0x2B, 0xF1, 0xFF, 0x96, 0x76, 0x8B, 0x4C, 0xA9, 0x85, 0x27, 0x47, 0x07, 0x5B, 0x4F, 0x50,

  # FvLength: 0x50000

  0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,

  #Signature "_FVH"       #Attributes

  0x5F, 0x46, 0x56, 0x48, 0xFF, 0xFE, 0x04, 0x00,

  #HeaderLength #CheckSum #ExtHeaderOffset #Reserved #Revision

  0x48, 0x00, 0x30, 0x09, 0x00, 0x00, 0x00, 0x02,

  #Blockmap[0]: 5 Blocks  0x10000 Bytes / Block

  0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,

  #Blockmap[1]: End

  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

  ## This is the VARIABLE_STORE_HEADER

!if $(SECURE_BOOT_ENABLE) == TRUE

  # Signature: gEfiAuthenticatedVariableGuid = { 0xaaf32c78, 0x947b, 0x439a, { 0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92 }

  0x78, 0x2c, 0xf3, 0xaa, 0x7b, 0x94, 0x9a, 0x43, 0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92,

!else

  #  Signature: gEfiVariableGuid = { 0xddcf3616, 0x3275, 0x4164, { 0x98, 0xb6, 0xfe, 0x85, 0x70, 0x7f, 0xfe, 0x7d }}

  0x16, 0x36, 0xcf, 0xdd, 0x75, 0x32, 0x64, 0x41, 0x98, 0xb6, 0xfe, 0x85, 0x70, 0x7f, 0xfe, 0x7d,

!endif

  #Size: (gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize) - 0x48(size of EFI_FIRMWARE_VOLUME_HEADER)

  0xB8, 0xFF, 0x01, 0x00,

  #FORMATTED: 0x5A #HEALTHY: 0xFE #Reserved: UINT16 #Reserved1: UINT32

  0x5A, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

}

看完发现眼花缭乱,这都写的啥呀,这个其实就是FV在固件中存放的实际显示,打开一个固件,咱们搜索_FVH:

 照着上面的代码比对一下,是不是相差无几?这里还有个小技巧,你可以通过搜索_FVH(ASCII)找出你的BIOS固件有几个FV哦,这个在代码中也是有些用处的。

前面咱们介绍了FV实际的结构(代码注释写的有),通过查看FDF文件,发现还有一种表现形式:

[FV.FVMAIN_LOGO]

FvAlignment        = 16
ERASE_POLARITY     = 1
MEMORY_MAPPED      = TRUE
STICKY_WRITE       = TRUE
LOCK_CAP           = TRUE
LOCK_STATUS        = TRUE
WRITE_DISABLED_CAP = TRUE
WRITE_ENABLED_CAP  = TRUE
WRITE_STATUS       = TRUE
WRITE_LOCK_CAP     = TRUE
WRITE_LOCK_STATUS  = TRUE
READ_DISABLED_CAP  = TRUE
READ_ENABLED_CAP   = TRUE
READ_STATUS        = TRUE
READ_LOCK_CAP      = TRUE
READ_LOCK_STATUS   = TRUE
FvNameGuid         = 35C40558-3BF2-4575-BD6C-540F5B4EDE46 

xxxxxxxxxx  logo.bmp

 这样写也是可以滴,但是还要注意一点:

0x003B0000|0x00080000

gPhytiumPlatformTokenSpaceGuid.PcdLogoBaseAddress|gPhytiumPlatformTokenSpaceGuid.PcdLogoSize

FV = FVMAIN_LOGO

 你要告诉编译的,你的这个固件放在那个地方,占用多少空间,这是前提。在PCD的使用中就说了,有的PCD变量在fdf文件中也有用到,就是这了,其中PcdLogoBaseAddress的值为多少,自己尝试去获取一下,后面的size也是。

所以fdf文件总的来说就两部分,属于先总后分,先FD后FV,总的概括一下,然后再仔细介绍。至于怎么去找FV啊啥的,后续在BIOS实战中再写吧

最后看一下它是怎么被发现编译的:

 ok,FDF文件就先介绍到这里

随着国家十四五新战略规划的推出,众多国内企业都参到国产芯片替代浪潮中来,可以预测未来越多的国产芯片会被设计、生产和使用在我们日常所使用的电子产品中,国产芯片拥有巨大的市场前景。 目前国产芯片采用的体系架构主要有X86、ARM、MIPS、RISC V、PowerPC、Alpha等。我们知道电子产品正常工作必须要有操作系统和各种应用软件,没有操作系统和应用软件的芯片就是一堆废铁,而大多数人并不知道的是没有系统固件来加载操作系统的电脑亦是一堆废铁, UEFI就是由UEFI行业协会提出和维护一种行业标准的系统固件,它支持目前市面上的大多数芯片体系结构和操作系统,随着标准的不断演进相信越来越多的体系结构的芯片和操作系统会被支持。 笔者从事BIOS开发已有十余年的时间,见证了Legacy BIOS辉煌隐退,也有幸了参了新世纪初系统固件从Legacy BIOS往UEFI BIOS的迁移的全过程。科技行业风起云涌新技术新架构日新月异,每每回望不禁感慨我辈可谓是“眼见着他起高楼,眼见着他宴宾客”的那一波BIOS人。曾经系统固件江湖还是Legacy BIOS的天下,BIOS人使用汇编语言编码、通过中断来操作系统沟通。自UEFI框架被广泛使以来开我们的发环境从纯汇编变成了99%的C语言加1%的汇编语言的模式,开发效率大大的加强了。 虽然UEFI框架大大加快了开发效率,但是由于系统固件开发属于比较偏门和专业的领域,学习和入门门槛比较高,现有的BIOS工程师又分布在大大小小的各个公司内部缺乏有效沟通和交流,同时BIOS源码又属于敏感和机密数据受到各种NDA限制,市面上对UEFI框架介绍的资料少之又少,因此笔者从2000左右开始就陆续以Cstyle_0x007为ID在https://blog.csdn.net/CStyle_0x007发布一系列博文,现已有数十篇原创文章。刚开始的想法是把博文当作工作笔记方便自己随时查阅,后来慢慢发展成了业内外感兴趣的朋友的沟通交流的平台。 随手写的博文难免有错误纰漏为了避免误导大众,准备把博文重新整理在纠正谬误同时也会补充一些新的内容,尽量做到所写的每句话都是无误的,也欢迎有兴趣的朋友踊跃提出意见和建议。组建了微信公众号,目的在于方便有兴趣的朋友一起交流,名字初步定为“固件C字营”,其中“固件”泛指一切固化的软件,这里主要指UEFI BIOS系统固件,“C”泛指“China“,我们可以把这里当作大家沟通交流的营地,我们会不定时发布一些行业资讯、工作、学习心得,感兴趣扫描下面二维码就可以加入,也可以发邮件到CstyleFirmWareCamp@outlook.com投稿分享你的想法。 本文取名《UEFI内核的导读》这里的UEFI专指“UEFI BIOS”,全文专注于对UEFI内核的梳理分享,同时兼顾对X86系统固件生态中常用的工程技术的介绍,主要包含以下内容:UEFI启动流程以及各个阶段主要完成的任务及参考的实现方式导读UEFI及PI规范中的常见Protocol的实现使用技巧UEFI固件生态中常见外设、总线、行业标准的协议内容及使用方法 雄关漫道真如铁,而今迈步从头越,系统固件雄起之路道阻且长,相信我们的BIOS人一定可以为国产芯片的起飞助力、为系统固件团队的壮大贡献自己的一份微薄之力,为每一个不畏艰难、不惧寂寞坚守在工作岗位的BIOS人加油,好样的。
### 回答1: UEFI(Unified Extensible Firmware Interface)是一种固件接口标准,用于用于替换传统的BIOS(Basic Input/Output System)固件,旨在提高系统启动速度、安全性和可靠性。 UEFI原理编程完整版PDF是一份详细的技术指南,提供了UEFI开发所需的全部信息,包括如何设计UEFI驱动程序、应用程序和固件,以及如何使用UEFI的各种功能。 这份PDF文件UEFI划分为四个主要模块:启动服务、管理服务、硬件抽象层和UEFI Shell。每个模块都有详细的描述和示例代码,此外还包含了UEFI的系统架构、数据结构、驱动程序应用程序的开发方法等内容。 此外,UEFI原理编程完整版PDF还介绍了UEFI安全性、多核技术、嵌入式系统等方面的关系,并为读者提供了关键的UefiSpec和UefiDebugTools库文档。 总之,UEFI原理编程完整版PDF是一份权威的技术指南,涵盖了UEFI方方面面的内容,非常适合开发人员和工程师学习和参考。 ### 回答2: UEFI(Unified Extensible Firmware Interface)是一种新型的启动编程接口,它替代了旧版的BIOS(基本输入输出系统)。UEFI原理编程可以帮助开发人员理解UEFI的工作原理编程技巧。 UEFI拥有完善的安全性和可靠性,其编程方式也十分灵活。BIOS相比,UEFI可以支持更多的硬件平台和更大的硬盘容量,同时也可以优化启动速度和程序的执行效率。 UEFI原理编程pdf完整版可以帮助开发人员更好地了解UEFI的概念和架构,并提供丰富的代码示例,帮助开发人员快速掌握UEFI编程技能。除此之外,该书还介绍了UEFI的启动流程、安全策略、UEFI应用的开发和调试等内容,对于想要深入学习UEFI编程的开发人员来说是一本很有价值的参考书。 总之,UEFI原理编程pdf完整版是一本优秀的技术参考书,其内容涵盖了UEFI的方方面面,对于想要深入了解和运用UEFI的开发人员来说具有很高的参考价值。 ### 回答3: UEFI(Unified Extensible Firmware Interface)是一种新型的系统固件接口,它为操作系统硬件之间提供了一种标准的接口。相比传统的BIOS,UEFI可以支持更多的硬件功能,同时也更加安全和灵活。 UEFI原理主要包括以下几个方面:1、UEFI接口包括了启动管理器,硬件抽象层,运行环境和应用层等模块;2、UEFI支持模块化设计和驱动加载,可以动态地加载和卸载硬件驱动,提高了系统灵活性和安全性;3、UEFI使用GUID Partition Table(GPT)替代MBR分区表,支持更大的硬盘容量和更稳定的系统启动;4、UEFI还支持Secure Boot功能,可以防止恶意程序篡改启动软件和系统文件,提高了系统安全性。 关于UEFI编程,需要掌握以下几个核心内容:1、UEFI开发环境的搭建,需要熟悉UEFI规范以及系统固件接口的程序编写;2、UEFI应用程序的设计和开发,可以利用UEFI提供的应用程序接口(API)或者开发自定义的应用程序;3、UEFI驱动程序的编写,需要掌握UEFI驱动程序的架构和编程模型;4、UEFI启动管理器的开发,需要熟悉UEFI启动管理器的设计和实现。 总之,UEFI是一种新型的系统固件接口,可以为操作系统和硬件提供一个标准的接口,提高系统的安全性和灵活性。对于UEFI编程的学习和掌握,则需要对UEFI规范和程序设计有深入的了解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值