【UEFI】--- 探究BIOS NvRam空间的的位置以及大小
按照国际惯例--先上问题:
1. 什么是NvRam空间,里面存储了什么数据
2. 如何找到NvRam空间在BIOS-bin文件中的位置
NvRam空间的学名为: Non-Volatile Ram即非易失性存储空间,简单来说就是一段掉电也不丢失数据的存储空间。这类存储介质有很多,像多数的E2prom,Rom都是可以作为该类空间的介质。而具体到BIOS的话,多数情况下可以理解为在BIOS-Rom中挖了一段空间,用来作为我们希望掉电也不丢失数据的存储空间。
问题1:NvRam空间都存储了什么数据?
NvRam在BIOS实际用途中其实分为几类,其中最常用的应该是就是BiosSetup配置界面下你能看到的一大堆配置接口了吧。BIOS-Setup下所有的数据变量最终在代码中呈现的样子应该是这样:

当然其实还有很多,没有完全显示出来,而通过最后的SYSTEM_CONFIGURATION这个结构体变量名应该也可以看到,所有的变量最终都被封装进了一个很大的结构体变量中。最终这个结构体变量会被存在NvRam空间中,用户每次在BIOS Setup界面下的操作其实最终都是修改这个变量并且最后保存在Rom中NvRam那段空间中。
问题2:NvRam空间在BIOS-Bin文件的哪个位置?
提出这个原因的目的是因为有一个需求是要求BMC在更新BIOS时要做到保存用户设置数据,那么方案就是BMC在更新BIOS的数据时,先从BIOS中把NvRam那段空间的数据读出来做备份,然后刷掉整个ROM空间中的数据,再把新版本得BIOS数据写入ROM存储介质中,最后再把预先备份的数据按照BIOS Layout布局写入指定的位置即可。基于这样的一个目的,因此BIOS需要提供NvRam空间的布局。也算是折腾了一段时间吧,大致的方式如下:
1)在layout布局文件中找到整个工程文件的整体布局,一般是在*.fdf文件中,例如我用的insyde的工程可以看到project.fdf文件可以看到每个区域的Size和Offset公式计算定义。标红框的时NVRam区域的SIZE,下面也有每个具体的NvRam区域的Offset计算,没截出来。根据这里的定义应该能最终可以计算出来。

扩展问题思考于分析:
问题3:如何快速计算频移地址?
在计算这一大堆数据的时候,请一定使用python/shell脚本,不然手算累死了,学会运用的你计算机技能,学习是为了用,学软件就是为了让事情变得更简单。
问题4:为何查阅最终的16M的Bin文件找不到期望的数据?
根据我最终计算出来的值为0x5b0000,我在编译出来的16M的BIOS-Bin文件找不到理想的值,全是0xff。

原因:由于当前的BIOS是已经将ME和最原始的BIOS-bin文件打包进一起后的文件,因此这里的0x005b0000实际根本就不是我们原始BIOS的数据。原始BIOS的文档应该是*.fd文件,按照我的工程可找到GRANGEVILLE.fd也就是GrangeVille这个平台的BIOS文件,通过二进制文档可查看结果如下图:GRANGEVILLE.fd这个BIOS源文件的大小是8M,这个文件无论大小,还是layout都是由是源码中*.fdf文件指定的,具体可查阅该文件。

问题5:为何在GRANGEVILLE.fd找到了目标数据,但实际数据的数量却少的可怜?
这个地方不得不牵扯到BIOS的代码执行,虽然BIOS已经定义了大量的NvRam的Variable数据来进行数据保存,但是这是第一次编译的结果,实际的数据应该是BIOS代码在执行时,读取后再写入到这个位置的。而且由于Variable实际存储是以Variable的方式来Get或者Set,所以甚至可能出现同一个ROM不做任何改动过,就在机器上做两次启动,然后用烧录器把BIOS-Bin文件读取出来,NvRam空间的数据都是不一样的。详细原因就要跟BIOS通过GUID来Get或者Set变量这种方式有关,有时间再把这个给普及下。
问题6:包过ME的Bin文件如何确定Offset,以及ME是按照什么规则来进行打包的?
刚已说过,实际BIOS的程序编译出来的文档大小是8M,但是我们通过ME工具打包后,通常可以将BIOS扩展到16M或者32M,那么是如何扩展的呢?我以16M的BIOS.bin构成介绍,如下图:32M的话,中间OXFF填充部分随之扩大。

问题7:借助工具进行分析
我也是后来才知道可以用工具直接分析BIOS最终Bin的构成,以此来确定。不过总归是要知道原理理解的才深刻,下面简单介绍下工具,来和我们上述分析过程进行验证.使用工具为UEFITool.exe工具


如上图,我们可以在该工具下,BIOS-Region中NVRam空间的类型,以及详细信息。Offset为0x5b0000,Full Size为0x30000。刚开始判断NvRam空间是,我以为仅有下面标红的一个,所以对比了半天bin文件数据,总是对不上。后来才意识到下图四个都是NvRam的布局,只是用途不同,下面四个数据的Size相加可得也是0x30000,和工具刚好对上。

至此,将此次分析中所遇到的所有问题,均分析完毕。如有错误之处,欢迎随时联系我指出。
也请随时关注我的公众号:像蚊子一样飞翔。
一起探讨,一起进步!谢谢!

【UEFI】--- 探究BIOS NvRam空间的的位置以及大小的更多相关文章
- BIOS设置之UEFI/Legacy BIOS切换图文详解
近几年出现的电脑其中相当一部分都配置了UEFI BIOS,不过大多都默认以Legacy BIOS方式启动.而Win8正式上市后, 所有预装Win8(或Win8.1)的电脑都配置了UEFI BIOS并且 ...
- 尽可能保留原有数据,建立UEFI与BIOS双启PE优盘
尽可能保留原有数据,建立UEFI与BIOS双启PE优盘1.确保优盘或者移动硬盘有一个FAT32分区,如果没有FAT32分区,就用傲梅分区助手或者ppm转换一个现有的分区到FAT32分区0x0C,或者新 ...
- surface 其实是UEFI与BIOS并存,借用官网的进入方法(少有更改)
surface 其实是UEFI与BIOS并存,借用官网的进入方法(少有更改) 第一种: 1. Swipe in from the right edge of the screen, and ...
- UEFI、BIOS、Secure Boot的关系和知识介绍
从Windows 8操作系统时代开始,安装操作系统的方法也有了很大的改变,Windows 8采用了Secure Boot引导启动的方式,而不是过去Win XP和Win 7的Legacy启动方式,从 ...
- Winform窗体最大化的时候,如何指定窗体的位置、大小
一.重写窗体的SizeChanged事件不能改变窗体最大化的位置和大小. public partial class Form2 : Form { public Form2() { Initialize ...
- Selenium2学习-031-WebUI自动化实战实例-029-JavaScript 在 Selenium 自动化中的应用实例之四(获取元素位置和大小)
通过 JS 或 JQuery 获取到元素后,通过 offsetLeft.offsetTop.offsetWidth.offsetHeight 即可获得元素的位置和大小,非常的简单,直接上源码了,敬请参 ...
- Selenium2学习-030-WebUI自动化实战实例-028-获取元素位置及大小
自动化测试过程中,有时需要获取元素的位置.大小,以获取元素的位置,通过 Actions 模拟鼠标,进行相对坐标操作.例如,有些元素定位不方便,或者需要对某一元素相对区域范围进行暴力点击测试,此时就需要 ...
- ios view的frame和bounds之区别(位置和大小)
前言: 学习ios开发有一段时间了,项目也做了两个了,今天看视频,突然发现view的frame和bound两个属性,发现bound怎么也想不明白,好像饶你了死胡同里,经过一番尝试和思考,终于弄明白bo ...
- javacpp-opencv图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作
欢迎大家积极开心的加入讨论群 群号:371249677 (点击这里进群) javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置. ...
随机推荐
- C++装饰器模式
UML图: #include <iostream> #include <string> #include <windows.h> using namespace s ...
- 20.java-JDBC连接mysql数据库详解
1.JDBC介绍 jdbc(java database connectivity)为java开发者使用数据库提供了统一的编程接口,它由一组java类和接口组成. JDBC需要用到的类和接口有: Dri ...
- VLC播放器的快捷键(shutcut)
ubuntu上的视频播放器功能简陋,不支持快慢速,于是需要一款播放器来替代它,从网上找了找,大家对VLC的评价出奇的一致, 于是试水了一下,发现功能确实强大,支持大多数多媒体文件以及各类流媒体协议 在 ...
- cogs 364. [HDU 1548] 奇怪的电梯 Dijkstra
364. [HDU 1548] 奇怪的电梯 ★ 输入文件:lift.in 输出文件:lift.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 呵呵,有一天我做了 ...
- 轻松弄懂var、let、const之间的区别
ECMAScript 6(简称ES6)是JavaScript语言的下一代标准,于2015年6月正式发布,也称ECMAScript 2015. ES6的好处 ES6的出现为我们前端带来了很多方便之处,以 ...
- Maven 基础环境搭建 项目依赖jar包导入
一.创建一个Maven工程 不清楚的话请查阅其它文档. 二.引入项目依赖的jar包 1.Spring 2.SpringMvc 3.Mybatis 4. 数据库连接池,驱动 5.其它(jstl.serv ...
- 假期续命充电——简单上手tesorflow2 框架
谈到深度学习,就不得不谈到tensorflow 在tensorflow之后出了2.0版本,相比之前有了很大的改变,趁着假期赶紧冲冲冲! 稍微学习了一些基础,做一个自我总结,作为一些基础的知识不再过多重 ...
- Redis Sentinel 高可用机制
内容目录: Sentinel 如何工作的? 核心配置项 怎么选出新 master 的? Sentinel 有多个,具体谁来执行故障转移? Sentinel 是怎么发现 slave 和其他 sentin ...
- PSP第一次总结
项目计划总结 周活动总结表 姓名:王金萱 ...
- 【Java面试】Mybatis篇
1.MyBatis编程步骤是什么样的? ① 创建SqlSessionFactory ② 通过SqlSessionFactory创建SqlSession ③ 通过sqlsession执行数据库操作 ④ ...