想学习EFI编程?福音来了

本文介绍了EFI编程的基础知识,强调了在Arm PC崛起的背景下学习EFI编程的重要性。EFI作为固件接口,有助于理解和优化计算机系统,特别是在Arm硬件上支持Windows等操作系统。学习EFI编程需要实践,格蠹科技提供了相关的实践环境和培训课程,帮助开发者深入掌握这一技术。

-  UEFI on ARM  -

  想学习 EFI 编程?

福音来了

2024/01/08

走进 UEFI 的世界,

感受固件编程的独特魅力,

了解UEFI on ARM的最新情报。

绝大多数的应用程序开发者都明白模块和接口的概念,网络上对于这方面的讨论和课程也很多。

那么对于底层开发,是否有类似的概念呢?

答案是肯定的。Intel在2001年推出的 EFI 就是一个关于固件的接口。靠着这个接口,Wintel联盟统治了PC 30年。

  什么是EFI?

Extensible Firmware Interface

EFI是Extensible Firmware Interface的缩写,即可扩展固件接口

我们知道,早期的PC是由传统BIOS负责启动的,BIOS程序存放于一个掉电后内容不会丢失的只读存储器(ROM)中,系统加电时处理器的第一条指令的地址会被定位到BIOS代码中,开始执行初始化程序。但BIOS存在诸多缺点,比如,大部分传统BIOS程序采用汇编语言开发,但是汇编开发的一个缺点是代码与设备的耦合度太大,代码受硬件变化的影响大。

另外,传统BIOS代码采用静态链接,增加硬件功能时,代码需做大量改动,而且传统BIOS没有提供动态加载设备驱动的方案。而随着CPU和其它硬件设备的革新,传统BIOS的所有这些缺点成为计算机系统发展的瓶颈。

在这样的背景下,EFI应运而生了。EFI可以更好地支持新的硬件设备(这可以从它的名称看得出来),同时还具有开发速度快、启动时间短、更加安全等其它特点。

为什么要学习EFI编程?

那么我们为什么要学习EFI编程呢?

前面说过,靠着EFI,Wintel联盟已经统治了PC 30年。但是,所谓三十年河东,三十年河西,随着硬件技术的不断升级和人们需求的多样化,以x86为架构的PC也表现出了一些不足,其中最大的问题就是电池的续航问题。随着移动办公的日益普及,人们对电池的续航性能要求越来越高,但x86天生的架构无法满足这一点。后起之秀Arm由于从出生时就携带着高效能的基因,从而在移动设备领域一直独霸天下。过去一些年里,Arm芯片的性能比不上x86,所以在PC领域一直是不温不火。但是芯片技术的发展遵循摩尔定律,即每隔18-24个月,在价格不变的情况下,芯片的性能会提高一倍。Arm现在推出的Cortex-A76,性能已经有了显著提升。再加上Big.Little技术,未来基于Arm的PC能够与基于x86的PC平分秋色也是非常可期的。

在苹果成功把MacBook从x86转移到Arm后,高通、英伟达等很多巨头也积极研发Arm PC。很多人认为,2024年将是Arm PC开始高速发展的一年。但目前还存在很多的工作要做。就以固件为例,虽然Arm早在2013 年就加入了EFI组织,但目前ARM上的UEFI(Unified EFI,是 EFI 的改良版)代码还存在一些问题,比如对ACPI的支持不完善,无法自由安装通用操作系统。

32a015643e32e1391f8ee9dfa28baf03.png

随着Arm PC的持续升温,必然对人才产生很强的需求。比如要在Arm硬件上支持Windows(WoA),那么就需要既懂底层,又懂Windows的工程师,而目前这方面的人才非常紧缺。

所以,从职业发展角度看,学好UEFI,便可以投身到正在兴起的Arm PC研发中,可能找到一份非常好的工作。这份工作可能是固件工程师,也可能是应用软件工程师。因为Arm PC流行后,大量的应用软件需要适配和优化,如果你对UEFI和WoA有一定了解,那么便成为紧缺的人才。

当然,学习UEFI,可以加深对计算机系统的理解,可以打通知识壁垒,提高工作效率,特别是缩短解决问题(debug)的时间。

如何学习EFI编程?

EFI PROGRAM.

13ca6ded4e2138910c35b2570aad8a38.png

8a458b34e372916f8b968527c482d1c6.png

学习EFI编程的方法有很多,可以看书,看文档,看代码,但最好的方法还是动手实践。C语言的发明者丹尼斯·里奇(Dennis Ritchie)有一句名言:学习一门编程语言的唯一方法就是用它来写代码。学习EFI编程也一样,要多写代码多实践。

当然,动手实践就需要有环境。目前,格蠹科技推出的幽兰本,已经可以在本机编译、部署、烧录和调试UEFI代码,对有志于从事底层开发的程序员来说,实在是一个福音。

另外,格蠹科技创始人兼CEO张银奎老师,也打算在2024年推出一期关于UEFI编程的培训,并且已于昨晚(2024年1月7日周日)举办了一场线上直播,给大家分享了EFI的前世今生。从与会者人数来看,大家对这个领域还是相当感兴趣的,有很多之前从事这个领域的朋友,也有很多后起之秀。

UEFI

培训分为六讲,都是以实战为主,以下是每节课的内容概要。

01

  UEFI跑起来  

要点:下载代码、调整信息输出、构建、熟悉镜像格式、烧录、启动、接收和分析调试信息、进入UEFI图形界面和外壳环境、执行外壳命令。

02

  修改UEFI界面  

要点:HII基础、定义表单、定义控件、界面和变量绑定、UEFI的配置机制(PCD)、定义PCD变量保存设置。

03

  编写UEFI应用——PcdEdit  

要点:UEFI模块、模块的基本文件(DSC、DEC、INF)、应用入口、UEFI的包、编写代码、观察和编辑PCD变量、加载和运行UEFI App、调试UEFI App的方法。

04

  开发UEFI驱动  

要点:面向对象基础、UEFI Protocol、GUID、函数指针、方法表、操作Protocol的基本函数:打开、寻找、响应。

05

  权力移交——加载OS  

要点:Boot Manager、通过UEFI启动Windows、通过UEFI启动grub、动态增加启动项、访问boot loader的原理和方法。

06

  电池出来——与OS配合  

要点:电池设备的驱动、UEIF的标准设备、Control Method Battery、ASL、使用ASL定义设备、结构体、字段、实现UEIF的标准方法、通过标准方法报告电池的基本信息和实时状态。

课程的更多信息请见(点击可直接跳转)

【盛格塾】

正心诚意,格物致知

人文情怀审视软件,以软件技术改变人生

9bbbfab81b47d2ef5f94964f206cbfc1.png

格友公众号

93321ba6a57845875367ae7e095ef9b8.png

盛格塾小程序

扫描上方二维码或在微信中搜索“盛格塾”小程序

可以阅读更多文章和有声读物

往期推荐

筚路蓝缕,UEFI固件以战说法

温笃丝再婚记

回味2023

比声音卡顿还难调试的问题

制作EFI(可扩展固件接口)涉及多个层面的技术与知识,尤其需要深入理解固件开发、硬件交互、操作系统引导流程以及标准化协议。以下是制作EFI所需学习的关键技术与知识领域: ### 1. 理解EFI/UEFI规范 EFI(Extensible Firmware Interface)由Intel提出,后由UEFI联盟维护,发展为UEFI(Unified EFI)。开发者必须熟悉UEFI规范文档,包括系统管理、启动服务、运行时服务、驱动模型、安全启动(Secure Boot)机制等关键内容。这些规范定义了固件与操作系统之间的接口,是开发EFI的基础[^1]。 ### 2. 掌握C语言与固件开发基础 EFI开发主要使用C语言,因其在底层硬件操作和性能控制方面具有优势。开发者需要掌握指针操作、内存管理、结构体对齐、编译器特性等与固件开发密切相关的编程技能。此外,还需熟悉EFI开发框架(如TianoCore EDK II),了解模块化设计、驱动编写、协议实现等开发流程[^2]。 ### 3. 熟悉x86架构与硬件初始化流程 EFI作为系统启动的第一道程序,负责初始化CPU、内存控制器、芯片组、存储设备等关键硬件。因此,必须理解x86架构的启动流程(如实模式、保护模式、长模式切换)、内存映射、中断机制、ACPI表结构等。了解主板固件(如BIOS/UEFI)如何与南桥/北桥或PCH(平台控制器中枢)交互也是必要的。 ### 4. 操作系统引导机制 EFI的一个核心功能是引导操作系统。开发者需熟悉Windows、Linux、macOS等操作系统的引导过程,包括MBR/GPT分区结构、EFI系统分区(ESP)、Boot Manager配置、启动项管理等。例如,macOS使用OpenCore作为引导加载程序时,需要精确配置EFI分区结构并放置正确的引导文件[^2]。 ### 5. 安全机制与可信计算 现代EFI实现中,安全机制尤为重要。开发者应掌握Secure Boot、Measured Boot、TPM(可信平台模块)集成、签名验证等技术。这些机制确保系统启动过程的完整性和安全性,防止恶意代码在预操作系统环境中执行。 ### 6. 工具链与调试能力 EFI开发涉及专用工具链,如EDK II的构建系统、交叉编译器、固件镜像打包工具(如FV、Capsule)等。同时,掌握固件调试方法(如使用QEMU、Bochs等模拟器、JTAG调试器)对于排查底层问题至关重要。 ### 7. 文件系统与EFI系统分区(ESP) EFI系统依赖FAT32文件系统来存储引导加载程序和配置文件。开发者需理解EFI系统分区(ESP)的作用,熟悉如何在不同操作系统下操作ESP,包括挂载、格式化、创建EFI目录结构等操作[^3]。 ### 8. 实际项目经验与开源项目参与 通过参与开源项目(如TianoCore EDK II、OpenCore、Clover等),可以深入了解EFI实现细节并积累实际开发经验。例如,OpenCore的安装过程要求用户具备对EFI分区结构及macOS引导流程的深入理解,这为开发者提供了宝贵的实践机会。 ### 示例:EFI引导加载程序的基本结构 ```c #include <Uefi.h> #include <Library/UefiLib.h> #include <Library/UefiApplicationEntryPoint.h> EFI_STATUS EFIAPI UefiMain ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { Print(L"Hello from EFI Application!\n"); return EFI_SUCCESS; } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值