https://drive.google.com/file/d/1kfg_HfRRto4m-v5LR5ohy1RI8P_XbcK4/view?usp=sharing
開始詳解, 首先因為PEI階段不能設定Variable只能讀取Variable, 為了怕混淆重點所以本範例把CloudPeim拿掉了, 請看Nt32Pkg.dsc和Nt32Pkg.fdf(搜尋cloud-test), 其實真正在主機板上執行的BIOS程式碼是把Variable寫到非揮發性記憶體(NVRAM), 所以常常會有在DXE階段設定Variable然後在PEI階段讀取它的情形, 但因為我們研究的是純軟體平台專案Nt32, 所以Variable沒有記憶功能, 每執行一次SecMain.exe所有的紀錄值都重來一遍, 這導致PEI階段永遠讀取不到Variable, 接下來關注程式碼, 首先我在Nt32Pkg.dec新增了一個Guid叫gEfiCloudVariableGuid, 這個Guid是設定和讀取Variable的參數, CloudDxeDriver.inf有把這個Guid加進來, 要看GetVariable和SetVariable這兩個函數的原型可以去MdePkg裡的UefiSpec.h看, 記得本座剛開始學BIOS時也在指標傳遞和記憶體配置上花了一些時間, 既然這個部落格是為了有C語言基礎的BIOS初學者寫的, 有函式原型應該對初學者會有幫助, 再來看重點CloudDxeDriver.c, 要注意CloudVariable[1] = {0}, 這代表CloudVariable[1]是一個真正有分配記憶體給它的陣列, 如果宣告成*CloudVariable = NULL, 會因為沒有記憶體配置導致當機, 接下來就簡單了, 首先用SystemTable去獲得GetVariable這個函式, 這個函式會嘗試去讀取CloudVariable(由於是CHAR16* 型態所以前面加個L), 當然第一次會讀取失敗因為根本沒設定, 然後我們就執行SetVariable(值是0x34), 最後再GetVariable一次當然就會成功了, 讀者可參閱Build資料夾裡的LOG.txt去驗證, 當然實際把範例加進各位的專案也不難
沒有留言:
張貼留言