Die Daten aus dem System Management Bios geben Aufschluss über die vorliegende Hardware und können nutzbringend in der eigenen Software verwendet werden. Ich selbst wollte SMBIOS-Daten auch in einer Applikation auf einem Mac Book Pro verwenden. Um diese auslesen zu können habe ich ein wenig suchen müssen. Aus diesem Grund möchte ich hier eine Step-By-Step-Beschreibung zu diesem Thema weitergeben:
Wo findet man die SMBIOS Daten:
In der
Dokumentation des Standards findet man einen Hinweis das sich zwischen zwei bestimmten Speicheradressen der Anchor-String "SMBIOS" verbirgt. Konnte dieser String gefunden werden, hat man die Offset-Tabelle für die SMBIOS-Daten im Speicher gefunden.
Wie kommt man an diese Daten:
Für diese einfache Frage ist die Antwort eigentlich auch sehr einfach. Man muss nur den Hauptspeicher des Rechner an der entsprechenden Stelle durchsuchen. Das ist auf alten Betriebssystemen wie DOS einfach möglich, auf modernen Betriebssystemen wie Windows, Linux oder Mac OS X nicht. Hier verwaltet der Kernel den Speicher und somit hat auch nur der Kernel Zugriff auf diesen. User-Space-Prozesse erhalten immer nur virtuelle Speicherseiten, also niemals den zu durchsuchenden Speicherbereich. Um doch an diesen Speicher zu kommen gibt es unter vielen Unix-System, sowie Linux und teilweise Mac des (k)mem-Device /dev/kmem. Auf dieses kann jedes User-Space-Programm zugreifen und somit auch die SMBIOS-Tabelle lesen. Windows bietet eine enstprechende Raw-Data-Tabelle die über WMI erreichbar ist. Ab Mac OS X 10.4 wurde dieses Device entfernt.
AppleSMBIOS.kext:
Statt sich jetzt eine eigene Kernel-Extension schreiben zu müssen, hat das Apple erledigt. Die AppleSMBIOS-Kernel-Extension bietet als IOService die Möglichkeit auf die SMBIOS-Daten zuzugreifen. Was ist also zu tun:
- Wir müssen erstmal einen Komnuikationspunkt zum Darwin-Kernel aufbauen. Hierzu nutzen wir einen Mach-Port (es ist erstmal nicht weiter wichtig mehr darüber zu wissen)
mach_port_t myMasterPort;
IOMasterPort(MACH_PORT_NULL, &myMasterPort);
- Also nächstes muss der AppleSMBIOS-IOService erstmal im System gefunden werden. Dabei werden Services in MAC OS X über eine Service-Identity identifiziert. Folgender Code sucht den SMBIOS-IO-Service:
CFMutableDictionaryRef myMatchingDictionary;
io_object_t foundService;
myMatchingDictionary = IOServiceMatching("AppleSMBIOS");
foundService = IOServiceGetMatchingService( myMasterPort, myMatchingDictionary );
- Wurde der Service gefunden kann man mit dem Lesen der SMBIOS-Daten beginnen.
CFMutableDictionaryRef properties = NULL;
CFDataRef smbiosdata = NULL;
IORegistryEntryCreateCFProperties( foundService,
&properties,
kCFAllocatorDefault,
kNilOptions );
CFDictionaryGetValueIfPresent( properties,
CFSTR( "SMBIOS" ),
(const void **)&smbiosdata );
- Jetzt stehen die SMBIOS-Daten zur Verfügung und müsse dem Standard entsprechend verarbeitet werden.
Abschluss:
Scheinbar gibt es hier und da ein kleines Problem mit der Abfrage von SMBIOS-Daten. Besonders wenn man in Verbindung mit
netkas versucht Mac OS X auf einer anderen Hardware zu nutzen. Auch gibt es eine
spezielle Anpassung um Probleme in Verbindung mit Adobe CS zu vermeiden.