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

可是如今的信息量越来越大,并且随着时间的推移记忆力会越来越不可靠,所以仅仅好把近期工作之余看的一些东西记录下来,避免被迅速忘记。这里就记录一下一些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. Apache .htaccess Rewrite解决问号匹配的写法

    如news.asp?id=123 需要把它定向到 news/123.html 这个用 RewriteRule 怎么写啊? RewriteRule ^news\.asp\?id=(\d+)$ news/ ...

  2. Table view 备忘

    Table view 备忘 本篇会以备忘为主,主要是一些基础的代理方法和数据源方法具体的优化好点子会后续跟上. Table view的数据源方法 必须实现的数据源方法 // 返回每一行的cell,可以 ...

  3. JS贪吃蛇游戏

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  4. [BZOJ 3669] [Noi2014] 魔法森林 【LCT】

    题目链接:BZOJ - 3669 题目分析 如果确定了带 x 只精灵A,那么我们就是要找一条 1 到 n 的路径,满足只经过 Ai <= x 的边,而且要使经过的边中最大的 Bi 尽量小. 其实 ...

  5. 这篇blog只是为了发一张图链到UOJ的博客去..

    UOJ卖萌表情,萌萌哒VFK如图.

  6. [BZOJ 1006] [HNOI2008] 神奇的国度 【弦图最小染色】

    题目链接: BZOJ - 1006 题目分析 这道题是一个弦图最小染色数的裸的模型. 弦图的最小染色求法,先求出弦图的完美消除序列(MCS算法),再按照完美消除序列,从后向前倒着,给每个点染能染的最小 ...

  7. linux解压命令

    .tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gun ...

  8. 14.7.2 Changing the Number or Size of InnoDB Redo Log Files 改变InnoDB Redo Log Files的数量和大小

    14.7.2 Changing the Number or Size of InnoDB Redo Log Files 改变InnoDB Redo Log Files的数量和大小 改变 InnoDB ...

  9. FILTER优化

    explain plan for select a.* from fxqd_list_20131115_new_100 a where (acct_no, oper_no, seqno, trans_ ...

  10. android gradle 多渠道打包

    buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:grad ...