【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:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置. ...
随机推荐
- java小项目之:象棋,羡慕你们有对象的!
象棋,是我国传统棋类益智游戏,在中国有着悠久的历史,属于二人对抗性游戏的一种,由于用具简单,趣味性强,成为流行极为广泛的棋艺活动.中国象棋是中国棋文化也是中华民族的文化瑰宝. 象棋还有很多口诀,这是最 ...
- 【转】DB2数据库编目的概念以及对其的正确解析
此文章主要向大家描述的是DB2数据库编目的概念以及对DB2数据库编目的概念的正确理解,在DB2中编目(catalog)这个单词看似很难理解,我自己当初在学习DB2数据库的时候也常常被这个编目搞的很不明 ...
- Python Django配置Mysql数据库
1 在项目中找到setting文件 打开 2 在里面找到 3 将Databases里面的数据改成 DATABASES = { 'default': { #引擎设置为Mysql 'ENGINE': 'd ...
- LeetCode 第17题--电话号码的组合(DFS)
1. 题目 2.题目分析与思路 3.代码 1. 题目 输入:"23" 输出:["ad", "ae", "af", &qu ...
- 网站 cache control 最佳实践
推荐阅读: 2020年软件开发趋势 高并发案例 - 库存超发问题 负载均衡的分类及算法 异地多活架构 Postman 的替代品来了 有时,当第二次访问网站时,看起来比较怪,样式不正常. 通常,是因为 ...
- Java入门 - 语言基础 - 10.条件语句
原文地址:http://www.work100.net/training/java-if-else.html 更多教程:光束云 - 免费课程 条件语句 序号 文内章节 视频 1 概述 2 if...e ...
- 团队项目——Alpha1版本
团队项目-Alpha版本发布1 一.格式描述 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience/ ...
- C#的WinForm窗体美化
为了帮助用户追求美观,.NET 4.0 专门为对此有需求的人提供了IrisSkin4.dll皮肤引用集,里面封装了许多对窗体重新描绘的方法,再搭配上WinForm特有的 .ssk 文件,就可以实现窗体 ...
- Spring-Cloud之Eureka注册中心环境搭建(单节点)
一 Eureka概述 服务启动时会生成服务的基本信息对象InstanceInfo,然后在启动时会register到服务治理中心. 注册完成后会从服务治理中心拉取所有的服务信息,缓存在本地. 之后服务会 ...
- ios---photo实现保存图片到自定义相册
#import "XMGSeeBigPictureViewController.h" #import "XMGTopic.h" #import <SVPr ...