2022年2月3日 星期四

輕鬆搞懂SMBIOS

之前為了看懂OpenBMC的MDR(Managed Data Region)這個功能,所以花了點時間研究了什麼是SMBIOS,所以這篇就是非BIOS專業對SMBIOS的理解

先附上SMBIOS的Spec SMBIOS Specification (dmtf.org)

The System Management BIOS (SMBIOS) 提供了主機板和系統供應商如何通過在Intel架構系統上擴展 BIOS 介面以標準格式呈現有關其產品的管理資訊。 這些訊息包含了CPU/Memory的serial number、manufacturer、speed等資料,也有PCIe Device、USB Device、或是Redfish Service等資訊,基本上都是Platform 上的韌體和硬體訊息。

訪問SMBIOS資訊

SMBIOS存儲在NVRAM中,如果是non-UEFI系統,可以通過在物理記憶體位址範圍 000F0000h 到 000FFFFFh搜索anchor-string(_SM_),找到SMBIOS的EPS(Entry Point structure)

如果是UEFI-based 系統可以直接搜尋GUID找到(SMBIOS_TABLE_GUID, {EB9D2D31-2D88-11D3-9A16-0090273FC14D})UEFI Specification 2.8 Errata B, May 2020

SMBIOS 結構

SMBIOS Table是由很多個SMBIOS 結構所組合而成的,每個SMBIOS結構都有一個格式化部分和一個可選的未格式化部分。 每個結構的格式化部分都以一個 4 Byte 的標頭開始。 格式化部分中的剩餘數據由結構類型決定,格式化部分的總長度也是如此。

以底下圖為例,如果SMBIOS中有兩個Type 4(Processor)的結構,表示BIOS所在的主機板上有兩個CPU socket

SMBIOS 結構類型

在SMBIOS Spec中有定義目前支援的SMBIOS結構類型,各家廠商的BIOS也可以在自定義範圍內定義其他類型


結構的使用指南

這邊用Spec中的BIOS Information (Type 0)範例介紹,確定好結構類型後,找到相對應的表,填入相對應的值,如果值的類型是STRING,就填入是未格式化區域中的第幾個字串,如果沒有字串,就填0

如果想寫工具代碼處理SMBIOS,就可以定義結構,套上去就能處理的值

當然有些值是要查表的,代碼中也要產生一個表才能對應

自定義SMBIOS結構類型

在Spec中有提到Type 128~256可供OEM defined

像是intel在Intel® Rack Scale Design BIOS & BMC Technical Guide中就有自定義像NIC,HD和PCIe等Type



沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。