SMBIOS是由DMTF(https://www.dmtf.org/)組織所制定及維護的業界規範,其目的在於讓主機
板及系統廠商有統一的標準格式,來描述產品相關的管理資訊,並供給作業系統使用。
本篇文章以SMBIOS 3.2.0 Specification 當作參考:
DSP0134_3.2.0
要得到SMBIOS的資訊,首先必須先找到SMBIOS 的Entry point,再透過SMBIOS entry point structure中的
"Structure Table Address",來找到SMBIOS table的記憶體位址。
SMBIOS Entry Point主要可以區分為較早期的版本SMBIOS 2.1及現在的SMBIOS 3.0版本,以32-bit和64-bit作為分別。
SMBIOS Entry Point structure的訪問方法
Legacy
在實體記憶體位址0x000F0000-0x000FFFFF之間,尋找"_SM_"(SMBIOS 2.1)
或者"_SM3_"(SMBIOS 3.0)字串,就可以訪問到其Entry Point structure。
UEFI
透過EFI Configuration Table和SMBIOS GUID來進行訪問。
SMBIOS 2.1為SMBIOS_TABLE_GUID{EB9D2D31-2D88-11D3-9A16-0090273FC14D}。
SMBIOS 3.0為SMBIOS3_TABLE_GUID{F2FD1544-9794-4A2C-992E-E5BBCF20E394}。
得到SMBIOS Entry Point 之後,就可以透過其"Structure Table Address"來訪問
SMBIOS structure。
EDK2中定義的 SMBIOS Entry Point結構
typedef struct {
UINT8 AnchorString[5];
UINT8 EntryPointStructureChecksum;
UINT8 EntryPointLength;
UINT8 MajorVersion;
UINT8 MinorVersion;
UINT8 DocRev;
UINT8 EntryPointRevision;
UINT8 Reserved;
UINT32 TableMaximumSize;
UINT64 TableAddress;
} SMBIOS_TABLE_3_0_ENTRY_POINT;
SMBIOS Structure可以分為formatted section和optional unformed section。
formmated section以長度4 byte的header起始,而接在header之後的資料格式根據Structure type有所不同。
optional unformed section則由文字字串組成。
SMBIOS Structure Header
Offset   |
Name   |
Length   |
Description   |
00h   |
Type   |
BYTE   |
Structure的類型。Type 00h到 7Fh是預留給SMBIOS spec定義,而Type 80h到 FFh則讓系統廠可以自行
定義。  |
01h   |
Length   |
BYTE   |
Structure formatted section的資料長度,從header的Type開始算起,不包含文字字串的
部分  |
02h   |
Handle   |
WORD   |
用來識別不同structure實體的一組16 bit number,其值範圍是從 FF00h到 FFFFh。  |
Text String
SMBIOS Structure的Text String區塊接在Structure的formatted section之後。而其是選擇性的,
SMBIOS的Structure內並不一定要含有Text String。每個Text String的結尾都是null character(00h)。
在SMBIOS structure的formatted section中,需要使用Text String的時候,就需要填上一個非0
值。假設其填值為02h,就代表這個string field要去參考Text String區塊中的第二個Text String。若其
填為0,就代表此string field不使用Text String。
SPEC中的BIOS Infomation(Type 0)範例:
使用Text String的BIOS Infomation(Type 0)
BIOS_Info LABEL BYTE
db    0 ; Indicates BIOS Structure Type
db    13h ; Length of information in bytes
dw    ? ; Reserved for handle
db    01h ; String 1 is the Vendor Name
db    02h ; String 2 is the BIOS version
dw    0E800h ; BIOS Starting Address
db    03h ; String 3 is the BIOS Build Date
db    1 ; Size of BIOS ROM is 128K (64K * (1 + 1))
dq    BIOS_Char ; BIOS Characteristics
db    0 ; BIOS Characteristics Extension Byte 1
db    'System BIOS Vendor Name',0 ;
db    '4.04',0   ;
db    '00/00/0000',0 ;
db    0 ; End of strings
沒有使用Text String的BIOS Infomation(Type 0)
BIOS_Info LABEL BYTE
db    0 ; Indicates BIOS Structure Type
db    13h ; Length of information in bytes
dw    ? ; Reserved for handle
db    00h ; No Vendor Name provided
db    00h ; No BIOS version provided
dw    0E800h ; BIOS Starting Address
db    00h ; No BIOS Build Date provided
db    1 ; Size of BIOS ROM is 128K (64K * (1 + 1))
dq    BIOS_Char ; BIOS Characteristics
db    0 ; BIOS Characteristics Extension Byte 1
dw    0000 ; Structure terminator