Geeks With Blogs
Step-by-Step into the cloud a blog of Dirk Eisenberg (>)
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:

  1. 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);
     
  2. 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 );
     
  3. 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 );

     
  4. 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.                 Posted on Sunday, February 24, 2008 8:36 PM Apple Mac OS X | Back to top


Comments on this post: SMBIOS Daten unter Mac OS X lesen

# re: SMBIOS Daten unter Mac OS X lesen
Requesting Gravatar...
Vielen Dank !
I have been looking for this for ages.. Wunderbar !
Left by Jarvis on Apr 29, 2010 5:34 PM

# re: SMBIOS Daten unter Mac OS X lesen
Requesting Gravatar...
Vielen vielen Dank! Genau das was ich gesucht habe. Lg, jus
Left by jus on Mar 27, 2012 10:53 PM

Your comment:
 (will show your gravatar)


Copyright © Dirk Eisenberg | Powered by: GeeksWithBlogs.net