【UEFI】--- 探究BIOS NvRam空間的位置以及大小

按照國際慣例--先上問題:
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,和工具恰好對上。

 

至此,將這次分析中所遇到的全部問題,均分析完畢。若有錯誤之處,歡迎隨時聯繫我指出。

也請隨時關注個人公衆號:像蚊子同樣飛翔。

一塊兒探討,一塊兒進步!謝謝!

相關文章
相關標籤/搜索