SMBIOS/DMI/MIF


//Management Information Format (MIF file) is a format used to describe a hardware or software component. 
//MIF files are used by DMI to report system configuration information. Although MIF is a system-independent format,
//it is used primarily by Windows systems. To install a new device in a Windows 95 system, the corresponding 
//MIF file is needed.

/*
SMBIOS(System Management BIOS)是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。 
DMI (Desktop Management Interface, DMI)就是帮助收集电脑系统信息的管理系统,DMI信息的收集必须在严格遵照SMBIOS规范的前提下进行。
 
SMBIOS和DMI是由行业指导机构Desktop Management Task Force (DMTF)起草的开放性的技术标准.
其中,DMI设计适用于任何的平台和操作系统.
DMI充当了管理工具和系统层之间接口的角色. 它建立了标准的可管理系统, 更加方便了电脑厂商和用户对系统的了解.
DMI的主要组成部分是Management Information Format (MIF)数据库。这个数据库包括了所有有关电脑系统和配件的信息。
通过DMI,用户可以获取序列号、电脑厂商、串口信息以及其它系统配件信息。 
*/

/*
System Management BIOS
From OSDev Wiki

Jump to: navigation, search

System Management BIOS (SMBIOS) is a standard developed by DMTF. The purpose of this standard is to allow the
operating system to retrieve information about the PC. 
On booting the SMBIOS will put a table somewhere in memory. By parsing this table it is possible to access
information about the computer and its capabilities.

Locating the SMBIOS Entry Point Table 

The SMBIOS Entry Point Table is located somewhere between the addresses 0xF0000 and 0xFFFFF, and must be on a 
16-byte boundary. To find the specific location of the start of the table it is necessary to search that region
of memory for the string "_SM_", and then check the structure's checksum (add all bytes and see if the
lowest 8 bits of the result are zero).
*/
//One example of how this can be done is demonstrated in the below code.

    char *mem = (unsigned char *) 0xF0000;
    int length, i;
    unsigned char checksum;
    while ((unsigned int) mem < 0x100000) {
        if (mem[0] == '_' && mem[1] == 'S' && mem[2] == 'M' && mem[3] == '_') {
            length = mem[5];
            checksum = 0;
            for(i = 0; i < length; i++) {
                checksum += mem[i];
            }
            if(checksum == 0) break;
        }
        mem += 16;
    }

    //Now mem contains the address of the Entry Point Table. 
    //Some old systems may not have the SMBIOS. So...

    if ((unsigned int) mem == 0x100000) {
        panic("No SMBIOS found!");
    }
    //Parsing the Entry Point Table 
    //The entry point table has the following structure


 struct SMBIOSEntryPoint {
 	char EntryPointString[4];    //This is _SM_
 	uchar Checksum;              //This value summed with all the values of the table, should be 0 (overflow)
 	uchar Length;                //Length of the Entry Point Table. Since version 2.1 of SMBIOS, this is 0x1F
 	uchar MajorVersion;          //Major Version of SMBIOS
 	uchar MinorVersion;          //Minor Version of SMBIOS
 	ushort MaxStructureSize;     //Maximum size of a SMBIOS Structure (we will se later)
 	uchar EntryPointRevision;    //...
 	char FormattedArea[5];       //...
 	char EntryPointString2[5];   //This is _DMI_
 	uchar Checksum2;             //Checksum for values from EntryPointString2 to the end of table
 	ushort TableLength;          //Length of the Table containing all the structures
 	uint TableAddress;           //Address of the Table
 	ushort NumberOfStructures;   //Number of structures in the table
 	uchar BCDRevision;           //Unused
 };

/*
    TableAddress contains the address of the table that contains all the structures with information about the PC.
 All of the structures are located from [TableAddress] to [TableAddress + TableLength]. The structures are located
directly adjacent to each other in memory, with a new structure beginning as soon as another one ends. Each
structure is composed of a header, a structure specific table, and a string table.
*/
//The format of the header is as follows.
 struct SMBIOSHeader {
 	uchar Type;
 	uchar Length;
 	ushort Handle;
 };

/*
    Located at TableAddress is a SMBIOS header. The value of Type indicates what element the structure contains
information about. (see Header Types section) Length indicates the size of header + data table. The strings are
not included in the length.

    Immediately after the end of the header is the data. At the end of the data table (Address + Length), the 
strings section starts. Each string is NULL terminated and is limited to 64 characters.

eg: the BIOS Struct (Type 0) is like this:
*/

 db 0 ; Indicates BIOS Structure Type            |
 db 13h ; Length of information in bytes         | HEADER
 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        | DATA
 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 ;                                   | STRINGS
 db ‘00/00/0000’,0 ;                             |
 
 db 0 ; End of structure

//At the end of the BIOS table, another table will start. The last structure has type 127.
/*
Header Types 

Code   Description
0      BIOS Information
1      System Information
2      Mainboard Information
3      Enclosure/Chasis Information
4      Processor Information
7      Cache Information
9      System Slots Information
16     Physical Memory Array
17     Memory Device Information
19     Memory Mapped Device Mapped Address's
32     System Boot Information


More details can be found in the Specification (see External Links)
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值