System Management BIOS
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.
Contents |
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)
External links
Threads
- http://www.osdev.org/phpBB2/viewtopic.php?t=16687 Info (saved here through lack of info)