按照国际惯例--先上问题:
1. 什么是NvRam空间,里面存储了什么数据
2. 如何找到NvRam空间在BIOS-bin文件中的位置python
NvRam空间的学名为: Non-Volatile Ram即非易失性存储空间,简单来讲就是一段掉电也不丢失数据的存储空间。这类存储介质有不少,像多数的E2prom,Rom都是能够做为该类空间的介质。而具体到BIOS的话,多数状况下能够理解为在BIOS-Rom中挖了一段空间,用来做为咱们但愿掉电也不丢失数据的存储空间。ios
问题1:NvRam空间都存储了什么数据?
NvRam在BIOS实际用途中其实分为几类,其中最经常使用的应该是就是BiosSetup配置界面下你能看到的一大堆配置接口了吧。BIOS-Setup下全部的数据变量最终在代码中呈现的样子应该是这样:shell
固然其实还有不少,没有彻底显示出来,而经过最后的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计算,没截出来。根据这里的定义应该能最终能够计算出来。3d
扩展问题思考与分析:blog
问题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,和工具恰好对上。
至此,将这次分析中所遇到的全部问题,均分析完毕。若有错误之处,欢迎随时联系我指出。
也请随时关注个人公众号:像蚊子同样飞翔。
一块儿探讨,一块儿进步!谢谢!