1. 程式人生 > >【UEFI】--- 探究BIOS NvRam空間的位置以及大小

【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空間位置以及大小

按照國際慣例--先上問題:1. 什麼是NvRam空間,裡面儲存了什麼資料 2. 如何找到NvRam空間在BIOS-bin檔案中的位置 NvRam空間的學名為: Non-Volatile Ram即非易失性儲存空間,簡單來說就是一段掉電也不丟失資料的儲存空間。這類儲存介質有很多,像多數的E2prom,Rom都是可

UEFI---BIOS中UserPassword的重複校驗總結

  UEFI作為目前較為流行的一套X86架構初始化的標準框架,已受到業界內的廣泛認可。而其中很多程式設計所採用的思想確實值得學習。今天總結下UEFI的框架下修改程式碼的一點小經驗,僅供菜鳥參考。 先列乾貨,具體的小結後續補充:   1. 明確你要的某個功能的實現邏輯,都需要在哪個位置新增程式碼

shell獲取第10+個位置參數

ldo 執行 logs 解釋 shell腳本 ron 花括號 2個 bin 轉載自:http://www.cnblogs.com/sheldonxu/archive/2012/06/25/2560770.html 在Shell腳本中,可以用$n的方式獲取第n個參數,例如,一

哲學康德的空間和時間理論—羅素 讀書筆記

所在 不可 固定 經驗 font 思維 ant indent pla 康德的空間先驗形而上學論點:   (1)空間不是從外在經驗抽引出來的經驗概念,因為把感覺歸於某種·外·界事物時先已假定了空間,而外界經驗只有通過空間表象才有可能。   (2)空間是一種先天的必然的表象

BZOJ1013 [JSOI2008]球形空間產生器sphere(高斯消元)

bzoj 消元 line str ++ pac void www 是個 題目 傳送門:QWQ 分析 高斯消元就是個大暴力。。。。 代碼 #include <bits/stdc++.h> using namespace

DB2SQL1585N 由於沒有具有相容頁面大小的可用系統臨時表空間,因此無法建立臨時表。SQLSTATE=54048

自己寫了一段SQL,SQL中包含ORDER BY 字句,但是在執行的時候報錯如下: 經過查詢發現是由於臨時表空間的PAGESIZE不夠大,可考慮建16k或者32k PAGESIZE的表空間 示例如下: 1. 建立pagesize 16k的bufferpool,自己去調大小 db2 create b

linuxLinux下檢視CPU型號,記憶體大小,硬碟空間的命令(詳解)

1 檢視CPU 1.1 檢視CPU個數 # cat /proc/cpuinfo | grep "physical id" | uniq | wc -l 2 **uniq命令:刪除重複行;wc –l命令:統計行數** 1.2 檢視CPU核數 # cat /proc/c

JS搜尋插入的陣列位置

給定一個排序陣列和一個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。 你可以假設陣列中無重複元素。 示例 1: 輸入: [1,3,5,6], 5 輸出: 2 示例 2: 輸入: [1,3,5,6], 2 輸出: 1

java虛擬機器面試乾貨_G1 GC的空間劃分

之前有看過介紹G1回收器的知識,但是一直沒有去完成一個整理。接著今天的功夫,好好把這部分知識總結一下。什麼是G1 GC通過前面的文章我們知道,在JDK 1.6版本之前,我們一般是使用ParNew+CMS兩個垃圾回收器來完成JVM中的垃圾回收的。但是它們的實現並不算特別的高效,

DB2監控臨時表空間使用

log 執行 mon 應用程序 數據庫 font one 監視 nbsp 在我們使用數據庫的時候,我們都知道應用程序在DB2上運行時,會產生臨時表空間,我們想要監測這些臨時表空間的使用情況,可以使用以下步驟:(1)打開monitor switches 中的table監視器:

Oracle探究recover database until scn

在ogg資料初始化中,對於使用rman進行資料初始化和匯入匯出、資料泵進行資料初始化,最終啟動replicat程序時使用的是不同的兩個引數。 對於rman進行初始化的,我們使用的語句是: start replicat rep_ynkg , atcsn xxxxxx 對於匯

Java在一個字串指定位置插入字串

四、更新 更新時間:2017年12月8日01:51:24 下面的方法有一個問題,是我剛才沒有考慮到的問題,就是下面的方法只適用於一次操作,如果兩次操作會有問題,什麼問題呢,就是你第一次插入之後,Stringbuilder裡面的index就被擾亂了啊,就像一個

Mysql探究Java Timestamp到 Mysql Timestamp發生的變化

Timestamp 是一個沒有時區觀念的時間戳,任何一個時區拿到這個時間戳都會轉變為所在時區的時間。探究探究Java Timestamp到 Mysql Timestamp發生的變化。 不附帶任何東西的

opencv在hsv顏色空間識別區域顏色

大綱 1. hsv顏色空間簡介 2. 為什麼是HSV 3. 識別方法說明 4. 識別步驟解析(程式碼片段) 4. 檢測結果 一、HSV顏色空間         由色調(Hue)、飽和度(Saturation)、亮度(Value)三個分量構成,HSV更接近於人眼的主觀感

Ubuntu 檢視磁碟空間大小命令

轉載自 愛哭的老漢 df   -h Df命令是linux系統以磁碟分割槽為單位檢視檔案系統,可以加上引數檢視磁碟剩餘空間資訊,命令格式: df -hl 顯示格式為:  檔案系統              容量 已用 可用 已用% 掛載點  Filesystem

Linux CentOS6.5安裝Python2.7以及pip等工具

自己 lin 存在 lean prefix nbsp ase 路徑 details 原文地址http://blog.csdn.net/u012538536/article/details/47360929。 CentOS6.5下是原來就有python的,我的鏡像裏面自帶的

轉載以此獻給所有OIer,以及所有競賽生,以及所有為夢想而不顧一切的人。

哪裏 的人 失誤 all blog 物理 cnblogs 現狀 煙臺 我們都是行走在鏡面邊緣的人。 低下頭看到的,是半個迷茫的自己,和半個不見底的深淵。 ——以此獻給所有OIer,以及所有競賽生,以及所有為夢想而不顧一切的人。 (名詞簡介:OIer,以信息學系列競賽為目標的

轉載Python操作Excel的讀取以及寫入

body .sh open 列數 讀取 efault jin rap ring 轉載來源:https://jingyan.baidu.com/article/e2284b2b754ac3e2e7118d41.html #導入包 import xlrd #設置路徑 path

通過js獲取系統版本以及瀏覽器版本

返回 ati event 一個數 alt eve qq瀏覽器 搜狗瀏覽器 rms 1 function getOsInfo() { 2 var userAgent = navigator.userAgent.toLowerCase(); 3

JavaMaven安裝、Eclipse配置以及相關錯誤解決集合

文件 格式 setting BYD cksum runt 文件編碼 原因 完成後 作者嘔血總結,下面寫的每一個錯誤我都遇過 · Maven安裝 · Eclipse配置 · Maven安裝 安裝前請確保已經裝有JDK。 一、 準備Maven程序包 到官網https