Cstyle的UEFI导读:第18.0篇 NVRAM的工作原理(上)

虽有句话说的好,有用的东西记在脑子里,没有的记在笔记本上。但是现在的信息量越来越大,而且随着时间的推移记忆力会越来越不可靠,所以只好把最近工作之余看的一些东西记录下来,避免被迅速忘记。这里就记录一下一些NVRAM相关的东西。

NVRAM的定义就不必罗嗦了,非易失性存储器,当然这种定义很宽泛,我们且不一样一个去说明,这里只说UEFI 里面最常用的狭义的NVRAM(SPI ROM里面的一块区域)。一般而论UEFI当中会用到两块区域作为NVRAM分别为NVRAM,NVRAM_BackUp,至于为什么要这么做其实原因很简单,那就是备份和安全保护,应为NVRAM在DXE阶段是可以读写的,既然能写就表示可能会出错,比如突然断电,软件或者硬件错误等等,而NVRAM作为UEFI当中非常重要的一个可供用来提供系统灵活配置的机制如果没有一套完美的容错机制就会发生很严重的问题,比如某个block由于某些原因出错,我们就需要保证这种错误不会导致系统的崩溃。

再来,NVRAM其实就是在整个SPI rom的区域划分出两个FV,这个FV的属性是可以读写的,在PEI阶段提供readonly variable 的ppi来仅提供读取的功能,在DXE阶段我们就能在RT service里面提供getvariable和setvariable的服务来通过GUID和variableName来搜索我们需要的变量,如setup的设定值。在X86当中NVRAM所存储的区域是刚好被南桥映射到CPU的内存空间,这个区域可以使用MMIO的方式直接读取和写入

就类似于x86系统在reset的时候从FFFFFFF0位置通过MMIO方式读取第一条指令一样。这个区域的大小是可以通过南桥的相关寄存器来设定的,一般会在sec阶段或者早期的pei阶段去设置它,保证该区域能被正确的映射。当然我们也可以使用南桥的SPI控制器来直接使用NOR Flash的读写命令来直接读写这段区域,就类似于在dos下用软件来刷新bios一样。这种一般会在RT或者是SMM模式下提供一些服务提供给其他的工具来调用,这些超出了NVRAM要将的范畴,先不管。

先讲下NVRAM在SPI Nor Flahs当中是如何存储的。其实它大概分成3部分:每一家的BIOS vendor的实现都不太一样,但是基本的东西差不多,就我看到的AMI A4的和UDK2014里面的实现就不一样,为了不违法NDA这里就只介绍UDK里面的实现方式。

第一部分:这里就只有一个EFI_FIRMWARE_VOLUME_HEADER的头,主要是将整个NVRAM当作一个FV来看待,这里FV的位置有是在buid的时候定义好的不可更改,在AMI的方案当中一般用token来控制,在UDK当中可以使用FDF里面来定义。我们可以从实际的build logo里面找到它对应的位置,然后使用UE来打开2进制文件来查看。这里先上一个UDK里面的图,这里定义NVRAM存在0x280000位置,长度为0xc000.

第二部分:这里就是FFS的区域,不同的实现方式可能不太一样,可以使用FFS2或者是FFS的格式。

第三部分:这里就是真正的FFS file区域了,这里的数据按照Variable store(VARIABLE_STORE_HEADER)的格式来存储,然后使用variable来顺序的存储每一个数据包括他们的名字,长度,GUID,属性(VARIABLE_HEADER)

下面是一个实际的SPI里面的数据存放格式,可以对照上面的数据逐个对比,楼主也对比过AMI的A4的实现,虽然他们的Variable store和variable的数据结构和实现方式不太一样,但是实现起来逻辑上是一模一样的,差别在于少量的算法实现不太一样,有兴趣可以自己对比看看:

下面先来说NVRAM的读取,为了简化,这里暂时不考虑FTW(FaultTolerantWrite)的部分,先简单介绍如何从NVRAM读取所需数据。这里只需要2个数据结构就可以完成对NVRAM变量的索引,一个是变量的存储仓库variable store,一个是实际的变量variable他们都有对应的文件头来表示,从刚刚上面降到的FV和FFS开始依次往下查找就可以了,同时需要注意的是pack的大小,是否需要填充字节。考虑到Flash的物理特性有可能会有位反转现象所以在读之前,需要先校验以下的两个文件头是否合法,如果出错,就需要使用到FTW以及NVRAM_BackUp的机制来处理,这个留着下次再说。还有就是以下是基于UDK的实现,其他的实现类似A4的实现跟这个不太一样,不过基本差不多也是有GUID和Name来作为变量的头,然后把变量存储在紧接着“头”的后面。具体的算法很简单可以参考Variable.c这个文件的实现,只要稍微有一点点的基础就能读懂,不需要赘述。

好了今天就先记录到这里,明天继续。

转载请注明出处

[email protected]  //  http://blog.csdn.net/CStyle_0x007

时间: 2024-08-01 22:42:51

Cstyle的UEFI导读:第18.0篇 NVRAM的工作原理(上)的相关文章

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: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ1N0eWxlXzB4MDA3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCM

Cstyle的UEFI导读:第19.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可以从ACPI spec Appendix B Video Extensions里面找到对应的每一个method,它为IGD graphics

Cstyle的UEFI导读:第19.0篇 SMM在UEFI当中的实现

 晚上吃的比较多不敢太早睡,趁空闲来看点东西,概念就不说了来看看SMM的几个阶段. SMM大概分为两个阶段:SMM初始化阶段和SMM runtime阶段,先来看看初始化阶段,还是先上图,下面的这幅图是讲的SMM的初始化和runtime整个阶段,整个阶段由DXE Dispatcher加载SMM IPL开始,到我们每一个注册的SMM hander被不断的执行为止,当然我们的SMM IPL也是一只DXE_RUNTIME_DRIVER,这里我开始也很奇怪为什么是DXE_RUNTIME_DRIVER而

FPGA第一篇:SRAM工作原理

一.SRAM概述 SRAM主要用于二级高速缓存(Level2 C ache).它利用晶体管来存储数据.与DRAM相比,SRAM的速度快,但在相同面积中SRAM的容量要比其他类型的内存小. 大部分FPGA器件采用了查找表(Look Up Table,LUT)结构.查找表的原理类似于ROM,其物理结构是静态存储器(SRAM), N个输入项的逻辑函数可以由一个2^N位容量的SRAM实现, 函数值存放在SRAM中,SRAM的地址线起输入线的作用,地址即输入变量值,SRAM的输出为逻辑函数值,由连线开关实

Cstyle的札记,Freertos内核详解,基于cortex-m3,第0篇

Freertos是一个硬实时内核,支持众多的微处理器架构,我们可以从它的官网(www.freertos.ort)下载它的sourcecode,同时也可以看出它支持了几十种的微处理器架构,这些就不罗嗦了.之所以选择研究这个,是应为窥探RTOS内核的内幕一直每一个做底层软件开发人员的心愿,选择过好几种RTOS但他们有的是需要收费,有的不太成熟也不够系统,有的虽然比较成熟但是系统太大不太适合研究.而freertos就不同了,它除了包含RTOS所需要的基本的东西之外最大的特点就是开源+简单并且支持了非常

第18完结篇-JAVA XML

第18完结篇-JAVA XML 每篇一句 :我们不缺方法,缺的是一往无前的决心和魄力 初学心得: 我们应该从中吸取教训,而不是累积伤痛 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-05-21| JAVA XML ] 1.什么是XML Extensible Markup Language:翻译过来为可扩展标记语言 Xml技术是w3c组织发布的,目前推荐遵循的是W3C组织于2000发布的XML1.0规范 在XML语言中,它允许用户自定义标签 一个标签用于描述一段数据:一个标签可分为

【OAuth2.0】Spring Security OAuth2.0篇之初识

不吐不快 因为项目需求开始接触OAuth2.0授权协议.断断续续接触了有两周左右的时间.不得不吐槽的,依然是自己的学习习惯问题,总是着急想了解一切,习惯性地钻牛角尖去理解小的细节,而不是从宏观上去掌握,或者说先用起来(少年,一辈子辣么长,你这么着急合适吗?).好在前人们已经做好了很好的demo,我自己照着抄一抄也就理解了大概如何用,依旧手残党,依旧敲不出好代码.忏悔- WHAT? 项目之中实际使用OAuth2.0实现是用的Spring Security OAuth2.0,一套基于Spring S

整合Acitiviti在线流程设计器(Activiti-Modeler 5.18.0)

整合Acitiviti在线流程设计器(Activiti-Modeler 5.18.0) 1.概述前言 一直以来都是从事大量的工作流相关的项目,用过很多商用的工作流产品,包括国内与国外的,尽管商用的工作产品在UI操作上比较人性化,但个人用户觉得,这东西只需要一些初级用户,对于我们一直在为一些高级的客户提供一些专业的数据整合.流程梳理.系统间的数据穿透时,这些系统因为不开源,给项目的实施带来巨大的风险,在一些项目栽过跟头后,我更偏向于使用开源的平台了.但开源平台最大的难点是在于你是否有足够的技术人员

C++技术问题总结-第0篇

从今天开始,对C++常用技术做个总结. 参考书籍:<C++Primer>.<C++对象模型>.<设计模式>.<Windows核心编程>.<STL解密>. 1. static_cast等四个cast的具体意义 C++类型转换:隐式转换和显式转换. 显式转换:static_cast.dynamic_cast.reinterpret_cast.const_cast. 1.1. static_cast 用法:static_cast<type-id&