System Management BIOS

From OSDev.wiki
Revision as of 22:00, 6 March 2008 by Frank (talk | contribs) (System Managenent BIOS moved to System Management BIOS: Spelling Error in title)
Jump to navigation Jump to search

System Management BIOS (SMBIOS) is a standard developed by DMFT. This standard consist in give informations about the system to the OS.

On booting, the SMBIOS, puts a table somewhere in the memory. By reading this table we can know all the component of the computer, your OS is running on.

The SMBIOS Entry Point Table is somewhere between the addresses 0xF0000 and 0xFFFFF. You can find it by looking for the string "_SM_" in that piece of memory.

I use this:

char *mem = (char *) 0xF0000;
while ((Bit32u) mem < 0x100000) {
	if (mem[0] == '_' && mem[1] == 'S' && mem[2] == 'M' && mem[3] == '_') {
		break;
	}
	mem++;
}

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!");
}

To read the Entry Point Table, I use a structure like this:

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 wich contain all the structures with the infos of the pc. From [TableAddress] to [TableAddress + TableLength], there are all data. At the end of one structure, another starts. Each structure is composed of a header, a structure specific table, string table The header is:

struct SMBIOSHeader {
	uchar Type;
	uchar Length;
	ushort Handle;
};

So at TableAddress you find a SMBIOSHeader Struct. Type indicates wich element are you seeing (0 = BIOS, 1 = System, 2 = Chassis, 3 = Processors, ...) Length indicates the size of header + data table. The strings are not included in the count.

At the end of the header, you can find the data table. At the end of that table (Address + Length), the strings section starts. Each string is NULL terminated and is limited of 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.

External links