Cstyle的UEFI导读
文章平均质量分 76
Cstyle_0x007
这个作者很懒,什么都没留下…
展开
-
《UEFI内核导读》ACPI编程入门
ACPI规范包含了ACPI硬件、ACPI软件、ACPI表、设备管理、电源管理、热管理等内容。其中ASL(ACPI Source Language)语言是默认用来编写ACPI代码的“声明式编程语言”,AML(ACPI Machine Language)是ASL源码被编译器编译后被AML解释器解释执行的字节码。AML是所有ACPI兼容的操作系统必须支持的,但是ASL是非必须的,只要是能最终被转换成AML的其他的任何语言都可以用来编写ACPI代码。 ASL用来定义ACPI对象(object)和原创 2021-11-17 21:12:56 · 2679 阅读 · 0 评论 -
《UEFI内核导读》全集,2023年11月更新
序言随着国家十四五新战略规划的推出,众多国内企业都参与到国产芯片替代浪潮中来,可以预测未来越多的国产芯片会被设计、生产和使用在我们日常所使用的电子产品中,国产芯片拥有巨大的市场前景。目前国产芯片采用的体系架构主要有X86、ARM、MIPS、RISC V、PowerPC、Alpha等。我们知道电子产品正常工作必须要有操作系统和各种应用软件,没有操作系统和应用软件的芯片就是一堆废铁,而大多数人并不知道的是没有系统固件来加载操作系统的电脑亦是一堆废铁, UEFI就是由UEFI行业协会提出和......原创 2020-11-21 19:58:31 · 3502 阅读 · 3 评论 -
UEFI PEI CORE的二个阶段与PeiCore函数的3次调用流程简介
UEFI PEI CORE的二个阶段与PeiCore函数的3次调用流程简介原创 2023-11-27 20:16:55 · 1107 阅读 · 0 评论 -
《UEFI内核导读》如果没有内存,程序代码还能不能执行?
SSE支持8个128bit的XMM寄存器,8个64bit MMX寄存器可以在UEFI环境下使用特定的pinsrd/ pinsrw/ pshufd/movd指令在通用寄存器之间传递数据,进而可以把XMM、MMX寄存器当做普通32bit数据暂存器来使用。子过程Function是需要被调用的过程,在堆栈还没有准备好的情况下,可以使用如下代码来实现,只要在Function内部保持通用寄存器不被修改(具体方法是把通用寄存器保存在MMX和XMM寄存器当中)就可以保证Function的调用不会破坏执行环境。原创 2023-01-11 21:25:55 · 628 阅读 · 0 评论 -
《UEFI内核导读》UEFI Application Binary Interface (ABI)简介
不会要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误,支持可变参数的函数。编译器,有类似的机制,区别在于使用不同的寄存器来传递参数和返回值。所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。,其他类型的参数根据参数类型不同其传递方式稍有不同,如下表。个参数使用寄存器传递,从第五个开始使用堆栈传递,例如,拥有。调用约定仅在输出函数名前加上一个下划线前缀,如,原函数为。寄存器,而不是通过堆栈来传递,同样函数返回值通过。不会要求调用者传递参数数量,原创 2023-01-09 20:34:16 · 1041 阅读 · 0 评论 -
《UEFI内核导读》SecCore与PeiCore简介(I)
PeiCore的32bit入口地址是可以被映射到0xFFFFFFE0连续的4个字节(小端模式)。整个PeiCore文件也可以被映射到BFV或其他的FV的任何位置,前提是需要SecCore创建EFI_PEI_CORE_FV_LOCATION_GUID类型的PPI,通过此PPI获取PeiCore所在的FV地址,进而在BFV或其他的FV里面去搜索EFI_FV_FILETYPE_PEI_CORE类型的FFS文件,从而得到PeiCore的映射地址,并跳转到PeiCore执行。敬请关注:“固件C字营。原创 2023-01-06 22:22:49 · 1203 阅读 · 0 评论 -
《UEFI内核导读》UEFI Firmware Storage简介
UEFI提供了基本的服务来访问Fireware File,在PEI阶段用EFI_PEI_SERVICES->(FfsFindNextFile, FfsFindFileByName、FfsGetFileInfo),在DXE阶段用EFI_FIRMWARE_VOLUME2_PROTOCOL->(ReadFile, ReadSection、WriteFile、GetNextFile), 或EFI_BOOT_SERVICES->LoadImage()。原创 2023-01-01 16:31:40 · 1863 阅读 · 1 评论 -
《UEFI内核导读》UEFI中驱动的执行顺序
UEFI中DXE驱动或PEIM的执行顺序有三种不同的机制,分别如下。其中APRIORI的优先级最高,Depex次之,FV布局为默认顺序,可以根据需要进行调整。开发过程中,可以选用三种方式中的任何一种来调整驱动的被执行的顺序,以此到达提前或延后执行某个驱动的目的,上例会先执行A驱动,然后执行B驱动。3. 合理设置驱动在FV的位置,一般在FDF脚本使用。2. Depex,一般在INF脚本内部使用。例1:ModulePEI.inf。例:project.fdf。例:project.fdf。原创 2022-12-31 18:08:30 · 1629 阅读 · 0 评论 -
《UEFI内核导读》UEFI是不是操作系统?
从上面四点来看,“管理并控制计算机操作”,“运用和运行硬件、软件资源”,“提供公共服务”,“提供用户交互”UEFI已经具备了操作系统的所有的基本功能,因此从笔者角度来看UEFI已经是一个不折不扣的微型操作系统了!UEFI提供了丰富的服务并提供了驱动模型,可以管理计算机所有的硬、软件资源,包括,CPU、内存、硬盘、显示、网络、键盘、鼠标等,用户可以在UEFI环境操作和控制整个计算机系统。UEFI提供的服务来运用和运行硬件和软件资源,比如可以在UEFI环境下,连接HTTP上网,FTP、绘图、访问磁盘文件等。原创 2022-12-31 18:02:47 · 911 阅读 · 0 评论 -
《UEFI内核导读》VS2019社区版EDK2开发环境搭建
以前的开发环境因更换电脑被破坏,重新基于最新的版本在Windows环境下使用VS2019社区版搭建UEFI/EDK2开发环境,简单记录。原创 2022-11-21 23:11:17 · 578 阅读 · 0 评论 -
《UEFI内核导读》一阶插值算法在UEFI中的应用
举例说明,在intel平台中我们一般会使用PL1来控制系统的长时间无故障运行的系统功耗,这个值一般来说越大系统性能越强,但是也伴随着系统的热设计必须的越强,这样才能把系统产生的热通过散热模组散到环境当中去,不过在无风扇系统中我们因为没有风扇,所有只能才有被动散热的方式,被动散热就要在系统温度达到一定的上限的时候主动降低系统的热源所产生的热量,在这里就是降低PL1的值,简化模型如下。顾名思义,一阶插值算法是多项式插值算法的一种,其中一阶插值算法在UEFI系统中是用的最多的算法。固件C字营·版权所有。.....原创 2022-07-24 17:19:47 · 347 阅读 · 1 评论 -
《UEFI内核导读》祖传代码引发的血案(I)
《UEFI内核导读》祖传代码引发的血案(I)敬请关注微信公众号:“固件C字营”============================================== 最近遇到一个奇怪的问题,大概就是BIOS在POST过程读写EC,非常小概率会失效。经测试发现失效的概率跟读写频率,读写速度相关。 于是乎,左手改EC代码,在相关的代码插桩加入log信息,右手分析祖传的BIOS代码,同样是打桩和加log,用终端来监视读/写过程中的异常,左右开弓忙的不亦乐乎。需要说明的是Cstyl.原创 2022-06-25 11:27:39 · 435 阅读 · 0 评论 -
《UEFI内核导读》之ACPI编程入门 第7章:特殊对象与类型
第7章:特殊对象与类型 ACPI/ASL支持一些预定义的对象类型和算子,它们有一些不同于其他对象的特性,极容易造成混淆,本章节对他们进行简单介绍。ArgX(Method Argument Data Objects)参数数据对象,用来向Method传递参数,作用域在Method内且只能用于传递参数使用。分为Arg0-Arg6共7个。从ArgX参数读数据:ObjectReference:类似DeRefOf效果,自动进行“去引用”,返回被引用的对象 Buffer:返回Buffer,...原创 2021-11-28 10:19:38 · 2377 阅读 · 0 评论 -
《UEFI内核导读》之ACPI编程入门 第8章,类型转换及规则
《UEFI内核导读》之ACPI编程入门 第8章,类型转换及规则第8章:类型转换及规则 对象类型转换包含两种,分别是隐式类型转换和显示类型转换,具体细节根据参数是输入参数或是输出参数有所不同。当输入参数类型与预定义操作数对象类型不匹配时,输入参数使用隐式类型转换,也称为“隐式源操作数转换”当被输出对象的类型与目标存储对象类型不匹配时,输出参数使用隐式类型转换,也称为“隐式结果对象转换”。原创 2021-11-24 23:06:48 · 1168 阅读 · 2 评论 -
《UEFI内核导读》之ACPI编程入门 第6章:对象类型及命名
固件C字营·版权所有敬请关注微信公众号:“固件C字营” ACPI/ASL字符集 与其他的编程语言类似,每一种语言都有其支持的字符集合,使用这些字符的组合来定义对象、路径、数字、常量、方法。字符集是组成ASL代码的最小基本单位。多个空格相当于一个空格。空行、小括号、逗号、新行,都是分隔符 “//”表示从”//”开始到行末都是注...原创 2021-11-21 09:34:15 · 1088 阅读 · 0 评论 -
《UEFI内核导读》之ACPI编程入门 第5章:对象(Object)
固件C字营·版权所有敬请关注微信公众号:“固件C字营”第5章:对象(Object)ACPI/ASL使用Name ( ObjectName, Object )算子在全局ACPI名字空间(Global ACPI namespace)创建一个对象,对象名为ObjectName,该对象名是对“Object”的引用。对象由三部分组,对象(Objec...原创 2021-11-20 22:41:20 · 1003 阅读 · 0 评论 -
《UEFI内核导读》之ACPI编程入门 第4章:方法(Method)
固件C字营·版权所有敬请关注微信公众号:“固件C字营”第4章:方法(Method) Control Method是ACPI/ASL预定义的一种对象类型(ObjectType)为8的对象。它可以调用或者被其他的Method调用,在调用过程中可以被阻塞但不能被抢占,当一个Method被阻塞时OSPM可以转而执行其他的Method。以下称之为...原创 2021-11-18 22:42:21 · 2261 阅读 · 0 评论 -
《UEFI内核导读》之ACPI编程入门 第3章:Hello World
固件C字营·版权所有敬请关注微信公众号:“固件C字营”第3章:Hello World 第一个ACPI/ASL程序“Hello World”,该程序会在调试终端输出“Hello World!”字符串。第一行,表示该程序需要引用外部的方法(Method)。第二行,空行,编译器会自动忽略。第三行,表示定义一个方法“HOWD()“,该方法...原创 2021-11-20 22:53:53 · 1404 阅读 · 0 评论 -
《UEFI内核导读》之ACPI编程入门 第2章:名词术语(Term)
固件C字营·版权所有敬请关注微信公众号:“固件C字营”第2章:名词术语(Term)ACPI:Advanced Configuration and Power InterfaceASL:ACPI Source Language,经过编译之后生成AML字节码AML: ACPI Machine Language方法:Control Method,控制原创 2021-11-20 22:57:33 · 1183 阅读 · 0 评论 -
《UEFI内核导读》Modern Standby软件/硬件流程图
《UEFI内核导读》Modern Standby软件/硬件流程图原创 2021-11-19 21:15:01 · 1129 阅读 · 0 评论 -
《UEFI内核导读》Platform Environment Control Interface(PECI)简介
固件C字营·版权所有敬请关注微信公众号:“固件C字营”PECI是Intel提出,主要用于intel处理器温度监控,功耗控制及状态监测,采用主/从架构的1-wire bus双向总线。 系统架构如下图,其中Host一般是EC或BMC或其他的系统控制器,Client一般是intel CPU。在现在的多核及多处理器架构的...原创 2021-11-07 21:42:52 · 5412 阅读 · 0 评论 -
USB存储设备UEFI协议栈
固件C字营·版权所有敬请关注微信公众号:“固件C字营”敬请关注今日头条号:”固件C字营“原创 2021-05-23 22:58:26 · 401 阅读 · 0 评论 -
《UEFI内核导读》How to Rotate Screen
之前的文章《UEFI内核导读》Graphics Driver介绍了UEFI环境如何在显示设备上输出字符或图形,GraphicsOutputprotocol为输出提供了最底层的硬件驱动支持。但是有时候我们由于机构或硬件设计的原因需要做一些定制的动作比如:机构设计导致用户手持的方向跟屏幕物理方向有90°、180°或270°偏差怎么办?这个时候就需要对屏幕进行旋转。如何旋转屏幕一般是由驱动来实现,在UEFI系统当中就需要由GOP驱动来实现,但是一般来说GOP是由silicon厂商来提...原创 2021-05-16 16:33:25 · 1006 阅读 · 1 评论 -
《UEFI内核导读》UEFI Battery Charging I
UEFI固件设计的初衷就是用来引导操作系统,下面简单介绍UEFI环境下windows是如何启动,以及在pre-OS环境下如何实现对电池充放电的管理。启动Windows流程基本分为以下几个阶段:1.硬件自举过程。主要完成了硬件的上电过程和BIOS第一条代码的调用(Device Powered on)。2.基本的硬件初始化过程。这里主要由不同的SOC芯片厂商来提供,如Intel会提供FSP(Firmware boot loaders)。3.UEFI运行时环境。包括boot service 、r.原创 2021-05-16 16:28:46 · 617 阅读 · 0 评论 -
Cstyle的UEFI导读:Open source UEFI BIOS开发实战简介,基于Intel 10代酷睿Cometlake-U硬件平台
本文介绍基于开源UDK+FSK方案在Intel 10代酷睿Cometlake-U硬件平台上实现power on实战,以及介绍如何使用完全开源的UDK来实现对我们OEM的板子进行porting与debug方法。主要从几个方面进行介绍分别是:目标的硬件开发板、需要准备开发环境 、OEM porting及构建、烧录并测试、持续改进等主题。通过使用开源UEFI方案我们现在我们可以在不花钱购买IBV如AMI、Insyde的代码的情况下开发基于X86的主板,使用开源方案可以节省数十万的的向IBV购买代码的开销,今天这一原创 2020-11-30 21:13:11 · 1858 阅读 · 2 评论 -
Cstyle的UEFI导读:PEI Image Service
所谓”固件“原始的定义是被固化的软件。历史上存储固件的介质有很多类似EEROM、Flash等,目前在UEFI固件领域基本都是用的NorFlash,它最大的特点是支持XIP也即片上执行。UEFI BIOS固件基本都是使用SPI接口的NorFlash来存储。目标二进制固件文件通常包括代码段(code)、只读数据段(RO Data)、已初始化读写数据段(RW Data)、BSS段、堆、栈、以及其他的资源段。固件在XIP阶段的代码在链接的时候,链接地址与存储地址是相同的都会是0x00000000,在C代码开始之原创 2020-11-26 22:23:41 · 751 阅读 · 0 评论 -
Cstyle的UEFI导读:Secure Boot简介
安全启动(SecureBoot)使用非对称加密与数字签名技术提供了一种从硬件到操作系统的安全启动信任链。本文介绍了系统固件、OS Loader、证书、密钥及之间的沟通流程。在windows下下可以使用如下命令获取PK,KEKdb、dbx、SetupMode、SecureBoot、PKDefault、KEKDefault、dbDefault、dbt、dbtDefault等全局变量的值。例如:当前系统的SetupMode的NV值是0,表示工作在user模式。平台密钥Platform Key (P原创 2020-11-25 20:36:21 · 4163 阅读 · 0 评论 -
Cstyle的UEFI导读:Embedded Controller Share ROM
此处仅以一个具体的例子分析share rom及整个flash的layout,仅BIOS区域(不包括ME)总大小是10MByte。如下图,FV_RECOVERY0(地址0x00A00000)映射到4G顶端(0xffffffff),使用FIT构建flash image的时候还会重定位最终FV_RECOVERY0的地址(用edit直接打开二进制文件的话,会在文件的末端,如图二所示),加入SPI flash descriptor,一般是在fffffff0h处放一条跳转指令,跳转到FV_RECOVERY0处。FV..原创 2020-11-23 21:45:47 · 1720 阅读 · 0 评论 -
Cstyle的UEFI导读:Embedded Controller链接过程
以MEC1428为例来介绍EC的开发流程和基本原理。按照惯例从链接开始介绍。一.自定义链接脚本。默认Mplab x默认使用xc32提供的脚本,在Mplab x也可以按照下图自定义链接脚本。二.定义地址映射针对MEC1428其地址及内存映射关系如下Data RAM:32K(0xBFD18000),Code RAM:160K(0xBFCF0000),ROM:192K(0xBFC00000),MMCR:2M(0xA0000000)/*************...原创 2020-11-23 21:34:48 · 737 阅读 · 0 评论 -
Cstyle的UEFI导读: UEFI的N种实现及差别
休息了快一个月了,找工作也没什么心情,闲来无事回头看看,自毕业以来一直都在BIOS这个行业打转,目前的各种新闻来看全球的IT行业都似乎不太景气,PC出货量一泻千里,想要有所转机看起来不是一天两天的事情,想来无事来看看做过的几个UEFI BIOS方案有什么不同。目前市面上常见的X86平台的UEFI实现方案大致分为几个,AMI,Insyde,phoenix还有一个就是号称是国产的百敖软件,再者就是in原创 2015-09-25 15:48:56 · 3010 阅读 · 8 评论 -
Cstyle的UEFI导读:第20.0篇 IGD OpRegion interface && IGD OpRegion PROTOCOL
ACPI IGD OpRegion interface是用SCI来实现IGD driver,OS,BIOS之间沟通的桥梁,IGD OpRegion PROTOCOL是UEFI BIOS构建桥梁的脊梁。Legacy的实现方式下与OS沟通的方式:OpRegion Memory Layout:Mailbox1当中提供的Public ACPI Methods可以原创 2014-11-15 17:30:23 · 4332 阅读 · 1 评论 -
Cstyle的UEFI导读: SMM在UEFI当中的实现
晚上吃的比较多不敢太早睡,趁空闲来看点东西,概念就不说了来看看SMM的几个阶段。 SMM大概分为两个阶段:SMM初始化阶段和SMM runtime阶段,先来看看初始化阶段,还是先上图,下面的这幅图是讲的SMM的初始化和runtime整个阶段,整个阶段由DXE Dispatcher加载SMM IPL开始,到我们每一个注册的SMM hander被不断的执行为止,当然我们的S原创 2014-11-10 22:41:38 · 9067 阅读 · 0 评论 -
Cstyle的UEFI导读:第18.0篇 NVRAM的工作原理(上)
虽有句话说的好,有用的东西记在脑子里,没有的记在笔记本上。但是现在的信息量越来越大,而且随着时间的推移记忆力会越来越不可靠,所以只好把最近工作之余看的一些东西记录下来,避免被迅速忘记。这里就记录一下一些NVRAM相关的东西。 NVRAM的定义就不必罗嗦了,非易失性存储器,当然这种定义很宽泛,我们且不一样一个去说明,这里只说UEFI 里面最常用的狭义的NVRAM(SPI ROM里面的一块区原创 2014-10-30 22:47:13 · 6911 阅读 · 1 评论 -
Cstyle的UEFI导读之Embedded Controller简介(上篇)
Embedded Controller就是我们常说的EC,它主要是由一颗特殊的MCU来构成,通常提供LPC的接口挂在LPC总线之下,由MCU所集成的一些外设来为PC提供一些Power,thermal,以及一些其他的控制。基本的EC架构一般有两种,使用share模式的时候需要Global Lock来保证资源的互斥,下面是非share模式下的框圖,SCI(默認INT9)跟SMI分別使用不同的通道和不同原创 2013-12-15 00:41:23 · 10445 阅读 · 0 评论 -
Cstyle的UEFI导读之Event && Timer (下篇:原理篇)
这次来说说Event和Timer在UEFI当中是怎么实现的以及原理,我们先从Timer开始,然后细细的拨开隐藏在底层的实现。先说Timer,那什么是Timer呢?其实在中文里面我们把它叫做定时/计数器,但是我的理解它不仅仅是一个定时/计数器硬件而是一个被程序设计者设定为工作在特殊模式下的 做定时/计数器,仅仅是一个硬件的定时器还不能算是Timer。定时/计数器在几乎所有的数字处理器系原创 2013-10-12 19:46:58 · 3979 阅读 · 0 评论 -
Cstyle的UEFI导读: UEFI当中的面向对象模式
玩UEFI的人,应该知道UEFI的核心是用C语言来描述的,C语言是一个面向过程的语言,它不具备C++/Java的面向对象的特性。但是仔细品味code我们就能感觉得到UEFI虽然是用C语言来描述的,但是里面大量的用到了面向对象的思想,在类似于protocol,ppi的架构中,就能很容易找到用C语言来实现面向对象特性的痕迹,下面来简单总结下这个方面的东西。C语言在组织功能块源代码方面有很多种方案,大概原创 2013-08-18 00:27:53 · 2376 阅读 · 0 评论 -
Cstyle的UEFI导读之SEC --- Reset Vector(下篇)
接着上一篇, 这次还是从0xFFFFFFF0这个位置开始,在开始之前先声明下,我要分析的ROM大小为8MByte,所以从下图1的左边的地址列可以看出最大的地址是0x007ffff0这个地址就是前面说的0xfffffff0,可以把这两个地址完全对等来看待,同理0x007fffff就等于0xfffffff。下面的计算和地址(32bit)都是基于这个逻辑,不再赘述。我们这次关注的点不是第一条指令,而重点关注FwVol所以我们需要从0xfffffffc(0x007ffffc)开始,我们获取到它的值是【0xfff40原创 2013-08-14 18:30:56 · 4087 阅读 · 2 评论 -
Cstyle的UEFI导读之SEC --- Reset Vector(上篇)
最近小看了一下SEC部分的code,现在来做个总结。所谓SEC就是CPU刚刚完成硬件初始化的是时候执行的和CPU体系架构息息相关的代码。主要是为后续CPU以及Chipset初始化代码所需的必备的环境做准备。大概总结了下有以下几个方面:1.RestVector的初始化,以及异常向量的初始化2.CPU工作模式的切换3.Enable Memory mape PCI-E Config Spa原创 2013-08-03 19:24:10 · 7783 阅读 · 5 评论 -
Cstyle的UEFI导读之PEI --- Notify && Callback
在UEFI当中的PEI阶段我们经常使用一个叫做Notify的工具来进行不同的PEIM模块通信和交换数据(callback函数的入口参数为*PPI指针,可以指向数据,也可以指向PPI描述符),这里来简单介绍下Notify。在PI SPC定义了PEIM能都调用的系统服务,其中对Notiry是这样定义Notiry的:NotifyPpi()Installs the notification serv原创 2013-07-30 22:07:47 · 10678 阅读 · 0 评论 -
Cstyle的UEFI导读之DXE---Event && Timer (上篇:实战篇)
在说这个话题之前,我们先看下UEFI当中,我们的代码运行在一个什么样的环境当中,刚开始接触UEFI的时候也很疑惑我们每天看到的代码到底是在一个什么样的硬件平台和模式下工作,经过多方查找资料和请教高人之后得到了一些结果,下面来和大家分享下,这里以X86架构为例。 X86有很多种工作模式这个我们应该都是知道的,但是我们做BIOS的大概之后关注到几个模式:实模式,保护模式。模式切换大概就是从实原创 2013-05-18 22:44:01 · 10070 阅读 · 8 评论