虽有句话说的好,实用的东西记在脑子里。没有的记在笔记本上。

可是如今的信息量越来越大,并且随着时间的推移记忆力会越来越不可靠,所以仅仅好把近期工作之余看的一些东西记录下来,避免被迅速忘记。这里就记录一下一些NVRAM相关的东西。

    NVRAM的定义就不必罗嗦了,非易失性存储器,当然这样的定义非常宽泛。我们且不一样一个去说明。这里仅仅说UEFI 里面最经常使用的狭义的NVRAM(SPI ROM里面的一块区域)。

一般而论UEFI其中会用到两块区域作为NVRAM分别为NVRAM,NVRAM_BackUp,至于为什么要这么做事实上原因非常easy。那就是备份和安全保护,应为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的格式。

     

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ1N0eWxlXzB4MDA3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

    第三部分:这里就是真正的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来作为变量的头,然后把变量存储在紧接着“头”的后面。详细的算法非常easy能够參考Variable.c这个文件的实现,仅仅要略微有一点点的基础就能读懂,不须要赘述。


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


转载请注明出处
Cstyle.z.zhou@outlook.com  //  http://blog.csdn.net/CStyle_0x007

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

  1. Cstyle的UEFI导读之SEC第一篇 Reset Vector

        最近小看了一下SEC部分的code,现在来做个总结.所谓SEC就是CPU刚刚完成硬件初始化的是时候执行的和CPU体系架构息息相关的代码.主要是为后续CPU以及Chipset初始化代码所需的必备 ...

  2. 第一篇——Struts2的工作原理及HelloWorld简单实现

    Struts2工作原理: 一个请求在Struts框架中的处理步骤: 1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求: 2.这个请求经过一系列的过滤器(Filter): 3.接着F ...

  3. Cstyle的UEFI导读:第20.0篇 IGD OpRegion interface && IGD OpRegion PROTOCOL

        ACPI IGD OpRegion interface是用SCI来实现IGD driver,OS,BIOS之间沟通的桥梁,IGD OpRegion PROTOCOL是UEFI BIOS构建桥梁 ...

  4. FPGA第一篇:SRAM工作原理

    一.SRAM概述 SRAM主要用于二级快速缓存(Level2 C ache). 它利用晶体管来存储数据.与DRAM相比,SRAM的速度快,但在同样面积中SRAM的容量要比其它类型的内存小. 大部分FP ...

  5. drools规则引擎与kie-wb和kie-server远程执行规则(7.18.0.Final)

    最近研究了一下规则引擎drools. 这篇博客带你搭建并运行一个可在线编辑,在线打包,远程执行的规则引擎(drools) 本篇博客同时参考https://blog.csdn.net/chinrui/a ...

  6. sql语句 decimal(18,0)什么意思

    decimal(18,0)18是定点精度,0是小数位数.decimal(a,b)a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38.b指定小数点右边可以存储的十进制数字的最大个数. ...

  7. 使用多种客户端消费WCF RestFul服务(二)——.net4.0篇

    .net 4.0篇 在.net 4.0下面微软并没有提供类似Net.Http的Rest访问组件,而是在codeplex上面提供的WCF REST Starter Kit Preview 2 里面可以找 ...

  8. 【Unity3D技术文档翻译】第1.0篇 AssetBundles

    前言 "Unity圣典"是目前对官方文档翻译比较详细的,然而文档的最新更新日期是2013年,已经远远落后最新版本,参考意义有限.官方文档.脚本手册是学习Unity3D最直接有效的途 ...

  9. openwrt从18.0.1降级回到17.0.6遇到的问题

    因为觉得openwrt的18的配置检查功能很费时,特别是遇到ar93xx慢的真可以,所以决定从18.0.1降回到17.0.6上 先把18.0.1的配置backup出来,然后刷17.0.6,再把back ...

随机推荐

  1. C语言的编译过程和GCC编译参数

    C语言的编译一般有三个步骤: 预编译: gcc -E -o a.e a.c 预编译a.c文件,生成的目标文件名为a.e 预编译就是将include包含的头文件内容替换到C文件中,同时删除代码中没用的注 ...

  2. 从MVC到前后端分离

    摘要:MVC模式早在上个世纪70年代就诞生了,直到今天它依然存在,可见生命力相当之强.MVC模式最早用于Smalltalk语言中,最后在其它许多开发语言中都得到了很好的应用,例如,Java中的Stru ...

  3. Hadoop 2.6.0编译on mac

    花了一个晚上的时间弄了下hadoop的编译环境,碰到些错误,这里保存下. 需要编译Hadoop,不但需要安装Maven,还需要安装protobuf 安装Maven 下载:apache-maven-3. ...

  4. Microsoft HoloLens 技术解谜(上)

    HoloLens 是什么? HoloLens 是微软发布的可穿戴式增强现实计算设备,它拥有这么几个关键要素: 它是增强现实产品,即 Augmented Reality(AR),AR 技术将计算机生成的 ...

  5. Reporting Services 钻取报表、子报表

    一.钻取报表 1.概念 钻取报表是指用户通过单击其他报表中的链接打开的报表.钻取报表通常包含某原始汇总报表中所包含的某项的详细信息. 例如,在此图中,销售额汇总报表列出了销售订单和总额.当用户单击该汇 ...

  6. 修改uCOS_II以实现“优先级+时间片”联合调度

    本文在uCOS II上增加时间片任务调度的的原理: 对设置为同优先级的任务使用时间片调度,不同优先级任务仍然使用uCOS II的优先级调度策略.在同优先级任务的时间片调度中,所有任务暂时时间片长度固定 ...

  7. SQL*Net more data to client

    The server process is sending more data/messages to the client. The previous operation to the client ...

  8. 怒刷BZOJ记录(二)1038~10xx

    我实在是太弱了...不滚粗只能刷BZOJ了...这里来记录每天刷了什么题吧. 2015-8-13: 正式开始! 1030[JSOI2007]文本生成器                       | ...

  9. Linux Shell编程(29)——函数

    和"真正的"编程语言一样, Bash也有函数,虽然在某些实现方面稍有些限制. 一个函数是一个子程序,用于实现一串操作的代码块,它是完成特定任务的"黑盒子". 当 ...

  10. What version of .NET Framework is integrated into what version of OS?

    http://blogs.msdn.com/b/astebner/archive/2007/03/14/mailbag-what-version-of-the-net-framework-is-inc ...