本篇文章以SMBIOS 3.2.0 Specification 當作參考:
DSP0134_3.2.0
SMBIOS entry point
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;
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
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
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
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
沒有留言:
張貼留言