作者:ramble(如需轉載請註明作者)
SMBIOS (System Management BIOS, SMBIOS),它是一種定出主機板及系統廠商如何以標準的格式顯示產品管理資訊的規格。
SMBIOS 及 DMI(Desktop Management Interface)規格兩者皆是由 Desktop Management Task Force (DMTF) 所草擬的,它是一個由業界所領導,實行技術規格以確認開放性標準的組織。
對於符合SMBIOS規範的電腦,可以通過訪問SMBIOS的結構獲得系統訊息,共有兩種辦法可以訪問:
- 通過即插即用功能接口訪問SMBIOS結構,這個在SMBIOS2.0標準裡定義了,從SMBIOS2.1開始這個訪問方法不再被推薦使用。
- 基於表結構的方法,表內容是tableentry point的數據,這個訪問方法從SMBIOS2.1以後開始被使用,從2.1開始,以後的版本都推薦使用這種訪問方式。在2.1版本中允許支援這兩種方法中的任意一種和兩種都支援,但在2.2已經以後的版本,必須支援方法2。
鑑於市場上計算機已經均支援SMBIOS2.3標準,所以只考慮方法2,基於表結構的訪問方式。
基於表結構訪問SMBIOS的過程是先找到EntryPoint Structure(EPS)表,然後通過EntryPoint Structure(EPS)表的數據找到SMBIOS數據表。
訪問SMBIOSEPS表的操作過程如下:
1.從物理內存0xF0000-0xFFFFF間尋找關鍵字「_SM_」
2.找到後再向後16個字節,看後面5個BYTE是否是關鍵字「_DMI_」,如果是,EPS表即找到。
註:按照SMBIOS規範説明,找到關鍵字」_SM_」後就可以確定此處就是EPS表結構,但我在實際操作中發現有為數不少的電腦的指定64K內存中有不只一個「_SM_」,所以不能只用找到」_SM_」來確定,需要繼續判斷16個字節後是否是「_DMI_」。
SMBIOSEPS表結構如下:
位置 | 名稱 | 長度 | 描述 |
00H | 關鍵字 | 4 byte | 固定是「_SM_」 |
04H | Check Sum | 1 byte | 用於檢查數據 |
05H | 表結構長度 | 1 byte | Entry Point Structure表的長度 |
06H | Major版本號碼 | 1 byte | 用於判斷SMBIOS版本 |
07H | Minor版本號碼 | 1 byte | 用於判斷SMBIOS版本 |
08H | 表結構大小 | 2 byte | 用於即插即用接口方法獲得數據表結構長度 |
0AH | EPS修正 | 1 byte | |
0B-0FH | 格式區域 | 5 byte | 存放解釋EPS修正的訊息 |
10H | 關鍵字 | 5 byte | 固定為「_DMI_」 |
15H | Check Sum | 1 byte | Intermediate Entry Point Structure(IEPS)的Check Sum |
16H | 數據表長度 | 2 byte | SMBIOS數據表長度 |
18H | 數據表位址 | 4 byte | SMBIOS數據表的真實內存位置 |
1CH | 數據表結構數目 | 2 byte | SMBIOS數據表的結構數目 |
1EH | SMBIOS BCD修正 | 1 byte | |
通過EPS表結構中的12H以及14H處,得出數據表長度和數據表地址,即可通過地址訪問結構表。從EPS表中的1CH處可得知結構表結構的總數,其中TYPE0結構就是BIOSinformation,TYPE1結構就是SYSTEMInformation。
每個結構的頭部是相同的,格式如下:
位置 | 名稱 | 長度 | 描述 |
00H | Type number | 1 byte | 結構的type number |
01H | 長度 | 1 byte | 本結的長度,就此type number的結構而言 |
02H | Handle | 2 byte | 用於獲得SMBIOS結構,使用方法未知 |
每個結構都分為格式區域和字符串區域,格式區域就是一些本結構的信息,字符串區域是緊隨在格式區域後的一個區域。結構01H處標識的結構長度僅是格式區域的長度,字符串區域的長度是不固定的。
下面以TYPE0(BIOSinformation)為例説明格式區域和字符串區域的關係
位置 | 名稱 | 長度 | 描述 |
00H | Type number | 1 byte | 結構的type number,此處是0 |
01H | 長度 | 1 byte | Type 0格式區域的長度,一般為14H,也有13H |
02H | Handle | 2 byte | 一般為0000H |
04H | BIOS廠商訊息 | 1 byte | 此處是BIOS賣方的訊息,可能是OEM廠商名,一般為01H,代表緊隨格式區域後的字串區域的第一個字串 |
05H | BIOS版本 | 1 byte | BIOS版本號,一般為02H,代表字串區域的第二個字串 |
06H | BIOS開始位址段 | 2 byte | 用於計算常駐BIOS鏡像大小的計算,方法為(10000H-BIOS開始位址段)*16 |
08H | BIOS發佈日期 | 1 byte | 一般為04H,表示字串區第三個字串 |
09H | BIOS ROM Size | 1 byte | 計算方法為(n+1)*64K,n為此處讀出的數值 |
0AH | BIOS特徵 | 8 byte | BIOS的功能支援特徵,如PCI,PCMCIA,FLASH等等 |
12H | BIOS特徵擴展 | 不定 | |
緊隨TYPE0(BIOSinformation)結構區域之後的就是TYPE0(BIOSinformation)字符串區域,如下所示:
db『System BIOS Vendor Name',0 ; 字符串以零結尾,第一個字符串:賣方訊息
db『4.04』,0 ; 第二個:BIOS版本
db『00/00/0000』,0 ; 第三個:發佈日期
db0 ; 以0為整個字符區域的結尾,所以要找下一個TYPE,只要在字符區域找到連續的0000H即可
註:當有EPS表中得到結構表的開始地址後,可以直接按結構來尋找相應的TYPE號,找到後直接讀取就是該TYPE對應的結構的格式區域訊息,然後向後移動結構區域長度(結構區域長度由該結構的01H處讀出)個BYTE,即是該TYPE機構的字符串區域。
由上面介紹可知,獲得BIOS訊息的辦法就是:
- 通過EPS表的12H和14H數據找到TYPE結構表,然後找到TYPE0的內存地址。(不一定是首個)
- 由TYPE0結構區域中得出相應BIOS訊息是否存在(存在則是上面所述的 01H,02H,03H依次排布,不存在則是相應的位置上為00H)。
- 如存在訊息,則從字符串區域中讀取對應BIOS訊息。
獲得SYSTEM信息方法同上,只是TYPE結構區域有所不同,請參照SMBIOSReference Specification
在Linux環境裡可以使用dmidecode這支程式去dump SMBIOS的資料
dmidecode主要功能:
桌面管理介面提供標準化的電腦硬體描述,包括硬體的特性,比如 BIOS 的序號、與硬體連接線。dmidecode 提供由 BIOS 輸出 DMI 的資料,通常被其他硬體偵測程式當作後端工具使用。
轉載來源:
http://cupidsd.bokee.com/4052760.html
其它參考資料:
System Management BIOS (SMBIOS) Specification
Desktop Management Interface (DMI) Standards
一篇世新的碩論-SMBIOS的研究與實作 寫得算蠻完整的唷
CodeGuru SMBIOS Demystified Windows VC++6.0