ACPI: Power Management und Hot Plugging
Transcrição
ACPI: Power Management und Hot Plugging
ACPI: Power Management und Hot Plugging Seminar Betriebssysteme SS2005 Roman Aspetsberger Matr-Nr.: 0256309 SKZ: 033 521 [email protected] 10. Juni 2005 Stefan Preuer Matr-Nr.: 0055832 SKZ: 880 [email protected] Zusammenfassung Es ist für uns alle schon fast selbstverständlich, dass man einen USB-Stick oder eine Digitalkamera an den laufenden PC ansteckt oder dass ein Notebook Alarm schlägt, wenn der Akku leer wird. Dazu benötigt man aber Betriebssysteme und Hardware, welche perfekt miteinander kommunizieren können. Dazu wurde von Hewlett-Packard, Intel, Microsoft, Phoenix, und Toshiba ein Standard entwickelt, welcher genau dies ermöglicht: ACPI - Advanced Configuration and Power Interface. In den folgenden Kapitel wird genauer auf diese Spezifikation eingegangen und die Einflüsse dieser auf heutige, moderne Betriebssysteme aufgezeigt. Auch auf den Unterschied zum vorangegangenen Standard APM wird eingegangen und die Vorteile von ACPI werden angeführt. Im zweiten Teil wird Hotplugging behandelt, welches bei einem modernen Betriebssystem nicht mehr wegzudenken wäre. Nach dem zugrundeliegenden Hardwarevoraussetztungen werden verschiedene Geräte im Deteil behandelt, unter anderem PCI, USB, Memory und CPU-Hotplugging. Zusätzlich soll eine Linuxfallstudie das Thema Hot Plugging vom IO-Management über die Treiberentwicklung bishin zur Behandlung von Hotplugging Ereignissen im UserSpace näher bringen. INHALTSVERZEICHNIS Inhaltsverzeichnis 1 2 ACPI 1.1 Powermanagement und Konfiguration . . . . . . . . . . . . . . 1.1.1 Grundsätzliche Ansatzmöglichkeiten - Firmware vs. OS 1.1.2 Das Powermanagement-Zustandsmodell von ACPI . . . 1.1.3 Einfluss von ACPI auf die Betriebssystemstruktur . . . . 1.2 Gerätekonfiguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 6 9 9 Hot Plugging 2.1 Allgemeines . . . . . . . . . . . . . . . . . . . . . 2.1.1 Physikalische Voraussetzungen: . . . . . . 2.1.2 Änderungssensitivität der Hardware: . . . . 2.1.3 Eindeutige Geräteidentifkation: . . . . . . 2.1.4 Betriebssystemunterstützung: . . . . . . . 2.2 Hardwareseitige Systemintegration von Geräten . . 2.3 Beispiele für Hotplugging . . . . . . . . . . . . . . 2.3.1 PCI . . . . . . . . . . . . . . . . . . . . . 2.3.2 USB . . . . . . . . . . . . . . . . . . . . . 2.3.3 IEEE 1394/Firewire . . . . . . . . . . . . 2.3.4 Memory Hotplugging: . . . . . . . . . . . 2.3.5 CPU Hot-Plugging: . . . . . . . . . . . . . 2.3.6 Node Hotplugging . . . . . . . . . . . . . 2.4 Surprise Removal von Hardware . . . . . . . . . . 2.4.1 Caching Strategien . . . . . . . . . . . . . 2.5 Fallstudie: Linux Hot-Plugging . . . . . . . . . . . 2.5.1 Traditionelle Geräteeinbindung unter Linux 2.5.2 IO Management des Linux Kernels 2.6 . . 2.5.3 Treiber unter Linux . . . . . . . . . . . . . 2.5.4 Zusammenspiel Hot-Plugging - UserSpace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 11 11 11 12 12 12 14 14 15 17 17 21 21 21 22 22 22 23 24 25 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 1 Kapitel 1 ACPI 1.1 Powermanagement und Konfiguration Einerseits ist der bis heute im Wesentlichen unveränderte Bestand des bereits 1965 von Gordon Moore aufgestellten berühmten „Gesetzes“, wonach sich alle 1.5 - 2 Jahre die Anzahl der verfügbaren Transistoren auf einem Chip verdoppelt, durchaus erstaunlich. Andererseits bringen die in Relation gesehenen kleinen Fortschritte im Bereich der mobilen Energieversorgung im Angesichte der besonders starken Nachfrage nach mobilen und eingebetteten Systemen Ernüchterung in Bezug auf eine derartige Nutzung dieser immer leistungsfähiger werdenden digitalen Mikroelektronik. Die sich daraus ergebende Herausforderung ist, die Kluft zwischen einer immer leistungsfähiger werdenden Hardware und einem aus Anwendungssicht vertretbaren Energieverbrauch zu überbrücken. Um dabei auf die Leistungsfähigkeit moderner Hardware nicht verzichten zu müssen benötigt es grundsätzlich entsprechende Powermanagement-Funktionalitäten sowohl auf Seiten der Hardware als auch der Software sowie insbesondere eine zielgerichtete Zusammenführung dieser. Der Inhalt dieses Kapitels bezieht sich besonders auf das Advanced Configuration and Power Interface (ACPI) mit welchem versucht wird eine derartige Schnittstelle zwischen Software und Hardware auf Computersystemen bereitzustellen. Das Ziel soll es dabei sein, ACPI von anderen Ansätzen abzugrenzen und somit gleichzeitig Motivation für den Einsatz von ACPI zu schaffen, die Funktionalität von ACPI in einer für die Verständlichkeit nötigen Tiefe darzustellen, als auch die sich ergebenden Anforderungen an die Hardware sowie im Besonderen an die Software zu verdeutlichen. 1.1.1 Grundsätzliche Ansatzmöglichkeiten - Firmware vs. OS Entwicklungsverlauf von Powermanagement Die Entwicklung von Powermanagement hat wie so oft sehr holprig begonnen was sich darin gezeigt hat, dass es kein integriertes Konzept gegeben hat. So haben OEM’s begonnen individuelle Lösungen für z.B. „Suspend-To-RAM“ oder „LCD-Display-blanking“ in die Systeme aufzunehmen. Prozessorseitig hat Intel mit der Einführung des Pentium-Prozessors einen unter der Bezeichnung System Management Modus (SMM) bekannten Prozessormodus unterstützt. In diesem Modus kann über einen System-Management-Mode-Interrupt (SMI) gewechselt werden, welcher über einen eigenen Prozessoranschluss getriggert werden kann. In einem eigenen Adressraum für diesen Modus können dann plattformspezifische Funktionen zum Power-Management realisiert werden. [Mes97]. Der erste Ansatz Powermanagement dem Betriebssystem in einer standardisierten Schnittstelle zugänglich zu machen wurde 1992 durch das Advanced Power Mangagement (APM) Interface ge2 1.1. POWERMANAGEMENT UND KONFIGURATION schaffen. APM hat grundsätzlich folgenden Konzeptuellen Aufbau: Abbildung 1.1: Advanced Power Management System [MI96a] Bei APM wird die Kernfunktionalität für das Powermanagement vom APM BIOS (Firmware) bereitgestellt, wobei grundsätzlich das APM BIOS selbständig im Hintergrund das Powermangement durchführt. Erweiternd ist es jedoch möglich, dass ein einzelner zentraler APM Treiber vom Betriebssystem für bestimmte Geräte die Kontrolle übernimmt, in dem dieser über das APM Interface APM BIOS Routinen aufruft bzw. Statusinformationen abfragt (Polling). [MI96b] Problematik des APM Ansatzes • Real Mode Bios Aufrufe: Ein Problem bei APM ist, dass im Falle eines Aufrufes einer APM BIOS Funktion durch das Betriebssystem (APM Treiber) dieses die Kontrolle an das APM BIOS übergeben muss. Zusätzlich kommt es zu einem Wechsel des Prozessormodus, da heutige Betriebssysteme im Protected-Modus laufen, die BIOS Routinen jedoch im Real Modus. Dies ist insbesondere für die Betriebssystemhersteller jedoch nicht akzeptabel, da sie dadurch die Betriebssystemstabilität stark abhängig von der Firmwarequalität machen. [GG03] • Umfang: APM bietet eine sehr eingeschränkte Funktionalität und lässt insbesondere im Modus der vollständigen Kontrolle durch das APM BIOS nur sehr einfache Scheduling-Strategien zu, auch da entsprechende Kontextinformationen dazu nicht zugänglich sind. Dies ist insbesondere auch dadurch begründet, dass die Firmware als Flash-ROM realisiert ist, wodurch sich aufgrund der Technologie Beschränkungen hinsichtlich der Speichergröße und Flexibilität (Debugging) ergeben. Es ist also ersichtlich, dass APM inhärente Schwachstellen hat, welche hinsichtlich der heutigen Anforderungen insbesonders an mobile Computersysteme nicht akzeptabel sind. Im nächsten Abschnitt wird nun auf das Advanced Configuration and Power Interface (ACPI) eingegangen mit welchem versucht wird, die genannten Schwachstellen von APM zu umgehen. 3 1.1. POWERMANAGEMENT UND KONFIGURATION Motivation für ACPI und OSPM Das Advanced Configuration and Power Interface (ACPI) wurde in seiner ersten Version 1996 gemeinsam von Intel, Microsoft und Toshiba entwickelt. Mittlerweile liegt die Spezifikation seit September 2004 in der Revision 3.0 vor. ACPI ist eine umfangreiche Spezifikation, die sich nicht nur auf Belange des Powermanagement bezieht, sondern ebenfalls eine Schnittstelle für die Konfiguration von Motherboard-Geräten darstellt. Eine wesentliche Intention ist dabei das Ersetzen von parallel gewachsenen Systemkonfigurationsschnittstellen durch eine einheitliche, umfassende und adäquate Schnittstelle und die Bereitstellung von leistungsfähigen und stabilen Möglichkeiten zum Powermanagement. Im Folgenden möchten wir besonders den Aspekt des Powermanagements betrachten. Als besondere Schwachstelle von APM haben wir im vorigen Abschnitt die Abgabe der Kontrolle an die Firmware und deren potenziell negative Auswirkungen auf die Systemstabilität, -konsistenz und -effizienz angeführt. Um dieser Problematik zu entgegnen greift ACPI auf das in der Informatik bewährte Konzept der Abstraktion zurück. Die grundsätzliche Überlegung dabei ist, anstatt Aktionen direkt durch Implementierungen in der Firmware zu realisieren, die nötigen Schritte zur Abwicklung einer solchen Aktion über die Firmware dem Betriebssystem zu kommunizieren wonach dieses die benötigten Schritte selbständig durchführen kann. Es bedarf also einer Beschreibungssprache für Aktionen, welche Hardwareinteraktionsoperationen beinhalten. In ACPI übernimmt diese Rolle die ACPI Machine Language (AML) welche eine bytecode-interpretierte Sprache darstellt. Die von ACPI parallel dazu spezifizierte für den Menschen lesbare Sprache ist die ACPI Source Language (ASL) welche man automatisch zu AML bytecode kompilieren kann. Wie aus Abbildung 2, welche die Abstraktionsebenen im Zusammenhang mit dem Powermanagement schematisch darstellt, ersichtlich ist, wird die platformspezifische Hardwarezugriffsbeschreibung in einem vom jeweiligen Betriebsystem zu implementierenden ACPI AML Interpreter ausgeführt, welcher die Schnittstelle zwischen dem Betriebssystem und dem eigentlichen Hardwarezugriff bereitstellt. Dem Betriebssystem werden nun auf einer abstrakten Ebene über die Firmware derartige AML-Kontrollmethoden (engl.: controll methods) für Aktionen im Zusammenhang mit dem Powermanagement zur Verfügung gestellt, welche es dann im ACPI AML Interpreter ausführen kann um das gewünschte Ziel zu erreichen. Abbildung 1.2: ACPI Abstraktionsmodell [GG03] Diese Zugriffsart unterscheidet sich grundlegend von der Ansatzweise die etwa APM verfolgt. An- 4 1.1. POWERMANAGEMENT UND KONFIGURATION statt für die Erledigung einer Aktion (z.B. den Batteriestatus abfragen) die Kontrolle an die Firmware zu übergeben, werden hier in Bytecode-kompilierter Form die dazu nötigen Operationen beschrieben und dem Betriebssystem zugänglich gemacht, welches dann in einer sicheren Umgebung (ACPI AML Interpreter) diesen, ohne die Kontrolle abzugeben, interpretierend ausführen kann. Aufgrund der Bytecode-Kompilierung ist eine hohe Effizienz bei der Interpretation gewährleistet. Laut [GG03] können die Vorteile wie folgt zusammengefasst werden: • Höhere Kontrolle durch das Betriebssystem. Der AML Interpreter kann Fehler während der Interpretation des AML-Codes abfangen und behandeln, anstatt bedingungslos der Firmware ausgeliefert zu sein. • Es können mehrere AML-Kontrollmethoden gleichzeitig in mehreren Threads ausgeführt werden und ankommende Hardware-Interrupts werden nicht blockiert. Dies ergibt sich dadurch, dass AML-Interpretation im gleichen Prozessormodus wie das Betriebssystem ablaufen kann. • Geringerer Firmwarespeicherbedarf ergibt sich aus der Tatsache, dass der AML-Bytecode entsprechend komplexe Operationen enthält, welche in der Firmware implementiert viel mehr Speicher brauchen würden. An dieser Stelle ist es noch nötig anzumerken, dass durch ACPI nicht zwingend die gesamte Hardwareinteraktion über den beschriebenen Weg der AML-Interpretation erfolgt, sondern insbesondere für besonders geschwindigkeitssensible Aufgaben durch ACPI eine fixe Hardwareschnittstelle festgelegt wird. Besonders wichtig ist es zu betonen, dass ACPI lediglich eine Schnittstellendefinition ist, welche wie gerade beschrieben, eine sehr flexible Hardwareimplementierung erlaubt. ACPI schafft somit nur die Grundvoraussetzung zum Powermanagement indem die Hardwareinteraktion festgelegt ist. Es fehlt also noch die nötige und letztendlich entscheidende Logik für das Powermanagement, d.h. eine Instanz, welche den aktuellen für das Powermanagement relevanten Systemzustand hält und entsprechend dieser Aktionen zur Optimierung des Energieverbrauchs, bei gleichzeitiger Beachtung der aktuell benötigten Leistung der Systemressourcen und etwaigen Benutzerpräferenzen, vornimmt sowie entsprechend auf relevante Ereignisse der Hardware reagiert. Es ist nahe liegend, dass eine derartige Instanz, um möglichst reichhaltige Kontextinformation für das Powermanagement zur Verfügung zu haben, bestmöglich auf der Ebene des Betriebssystems einzugliedern ist. Man spricht in diesem Falle von „Operating System directed Powermanagement“ (OSPM). Die Ausprägung und Realisierung von OSPM ist hochgradig betriebsystemabhängig, da es ein Bestandteil dieses ist und mit den anderen Betriebssystemkomponenten sowie Anwendungen interagieren muss. Ebenfalls sei erwähnt, dass OSPM in der Regel nicht ein monolithischer Betriebssystemblock ist, sondern durchaus über mehrere Betriebssystemkomponenten wie etwa Gerätetreiber verteilt sein kann. OSPM bezeichnet somit vielmehr das grundlegende Konzept, nach welchem das Betriebssystem sozusagen die Taktik für das Powermanagement bestimmt. Als Gegensatz sei hier noch einmal das weniger leistungsfähige Konzept von APM erwähnt, in welchem hauptsächlich die Firmwareselbst über das Powermanagement entscheidet. Da die Firmware jedoch nur wenig Information über die Anwendungs- sowie. Betriebssystemebene, welche letztendlich die treibende Ebenen hinsichtlich der benötigten Systemleistung sind, hat, ist es konzeptuell unmöglich, auf dieser Ebene eine umfangreiche Powermanagement-Taktik zu implementieren. 5 1.1. POWERMANAGEMENT UND KONFIGURATION 1.1.2 Das Powermanagement-Zustandsmodell von ACPI ACPI verfolgt auch in der Bereitstellung eines Zustandsmodells bezüglich des Powermanagements konsequent das Prinzip der Abstraktion, was aufgrund der Verschiedenartigkeit von Hardwaregeräten sehr nahe liegend ist. Im Prinzip wird dabei der diesbezügliche Systemzustand durch ein Zustandsmodell kategorisiert. Folgende Abbildung zeigt dieses Zustandsmodell insbesondere für den globalen Zustand: Abbildung 1.3: Global System Power States und Transitionen [CCC+ 04] Im Wesentlichen besteht das Zustandsmodell aus 5 grundsätzlichen Dimensionen, welche jedoch in Ihren tatsächlich vorkommenden kombinierten Ausprägungen miteinander verkoppelt sind. Diese 5 Dimensionen mit ihren jeweiligen Ausprägungen sind: • Global System State: G0 - G3 • Sleeping State: (S0), S1 - S4,(S5) • Device Power State: D0 - D3 • Processor Power State: C0 - Cn • Device and Processor Performance State: P0 - Pn Wobei jedoch zu beachten ist, dass für jedes Gerät bzw. jeden Prozessor ein individueller Device Power State bzw. Processor Power State sowie Device and Processor Performance State besteht. 6 1.1. POWERMANAGEMENT UND KONFIGURATION Im Folgenden werden nun die einzelnen Zustandsdimensionen sowie deren Zusammenhang beschrieben [CCC+ 04]: Global SystemState Global System States beziehen sich auf das gesamte System und sind für den Benutzer deutlich wahrnehmbar. Man unterscheidet: • G3 Mechanical Off: In diesem Zustand ist der Computer mechanisch von der Stromversorgung getrennt. Es ist ein Betriebssystemneustart erforderlich, um wieder in den Working State zu gelangen. • G2 (S5) Soft Off: In diesem Zustand ist der Computer mechanisch mit einer Stromversorgung verbunden, bezieht jedoch minimale Leistung von dieser - im Wesentlichen nur um ein elektronisches Einschalten zu ermöglichen. Prägend für diesen Zustand ist ebenfalls, dass der Systemkontext nicht durch die Hardware gesichert ist und folglich ein Neustart nötig ist um in den Working State zurückzukommen. Im Prinzip ist dieser Zustand identisch mit dem tiefsten Sleeping State S5, weshalb er auch oft so bezeichnet wird. • G1 Sleeping: Dieser Zustand ist durch eine geringe Leistungsaufnahme geprägt, wobei jedoch keine Usermode-Programme ausgeführt werden und eine Rückkehr in den Working State ohne Betriebssystemneustart möglich ist. Um dies zu ermöglichen, muss der Systemkontext durch Hardware und/oder Softwaremaßnahmen gesichert werden. Die nötige Latenz zum Zurückkehren in den Working State hängt von der Tiefe des Sleeping States ab und wird durch die Dimension des Sleeping States ausgedrückt (S1 - S4), welcher also nur in diesem Global State eine sinnvolle Bedeutung hat. • G0 Working: Dies ist der einzige Global State in welchem Usermode-Programme ausgeführt werden, also der Computer für den Benutzer Arbeit verrichten kann. Wobei in diesem Zustand die Dimensionen Device Power State und Processor Power State eine sinnvolle Bedeutung erlangen, da die Leistungszustände der einzelnen Geräte sowie Prozessoren in diesem Zustand dynamisch entsprechend der Powermanagement-Taktik angepasst werden können. Sleeping State Sleeping States stellen eine Unterkategorisierung des Global State G1 (Sleeping) dar, und unterscheiden sich für den Benutzer im Wesentlichen hinsichtlich der Latenzzeit zur Rückkehr in den Global Working State G0. Man unterscheidet folgende Sleeping States: • S1 Sleeping State (Standby): Dieser Sleeping State hat die geringste Aufwachlatenzzeit. Entscheidend ist dabei, dass kein Systemkontext verloren geht, da er allein durch die Hardware gehalten wird. • S2 Sleeping State: S2 ist ähnlich zu S1, jedoch geht in diesem Sleeping State der CPU- und Systemcache-Kontext verloren wodurch dieser durch das Betriebssystem vor dem Betreten gesichert werden muss. • S3 Sleeping State (Suspend to RAM): S3 ist ebenfalls ähnlich zu S1 und S2, jedoch geht in diesem Fall der gesamte Systemkontext, mit Ausnahme des Systemspeichers, verloren (CPU, Cache und Chipsatz Kontext), und muss somit durch das Betriebssystem gesichert werden. • S4 Sleeping State (Suspend to Disc): Dies ist der Sleeping State mit der geringsten Leistungsaufnahme und gleichzeitig der längsten Aufwachlatenzzeit. Um die Leistung auf ein Minimum 7 1.1. POWERMANAGEMENT UND KONFIGURATION zu reduzieren werden dabei alle Geräte ausgeschaltet. Um aus diesem Zustand wieder ohne Betriebssystemneustart in den Working State zu gelangen, muss der gesamte System- und Plattformkontext auf einem nicht flüchtigen Speicher gehalten werden, weshalb man diesen Zustand auch Non-Volatile Sleep nennt. Dieses Sichern des Kontextes wird üblicherweise durch das Betriebssystem vorgenommen, wobei dazu meist eine Datei auf der Festplatte verwendet wird (NVS File . . . Non-Volatile Sleep File). Wenn das System den Zustand wieder verlässt (üblicherweise angestoßen durch das Drücken des elektronischen Ein-/ Ausschaltknopfes), wird am Beginn des Betriebssystemneustarts diese NVS File eingelesen und nach diesem der Kontext vor dem Betreten von S4 wieder hergestellt. Da dieser Zustand auf nicht flüchtigem Speicher beruht kann die Stromversorgung mechanisch getrennt werden und dieser Zustand grundsätzlich beliebig lang andauern, ohne eine Rückkehr in den Working State unter selbem Kontext wie vor dem Eintritt in S4 zu gefährden. Device Power State Jedes Gerät, welches im Rahmen von ACPI Powermanagement behandelt wird, hat einen individuellen Device Power State, wobei dieser entsprechend den aktuellen Anforderungen in der Regel benutzertransparent angepasst wird. Für alle Geräte haben die Device Power States D3 und D1 die selbe Bedeutung. So bezeichnet D3 (Off) den Zustand in welchem die Energieversorgung vollständig vom Gerät entfernt wurde und somit der gesamte Gerätekontext verloren geht - dieser muss also etwa vom jeweiligen Gerätetreiber vorher gesichert werden. D0 (Fully On) hingegen bezeichnet den Zustand, in welchem das Gerät vollständig aktiv und damit auch den größten Energieverbrauch hat. Zwischen diesen Extremen gibt es noch die Zustände D2 und D1, deren genaue Bedeutung für diesbezüglich gleiche Klassen von Geräten definiert ist. Allgemein gilt jedoch, dass in D2 weniger Energie verbraucht wird als in D1 und somit auch mehr an Gerätekontext verloren geht. Es sei noch erwähnt, dass nicht jede Geräteklasse D1 und/oder D2 vorsehen muss. Processor Power State Processor Power States sind vom Konzept her ähnlich zu den Device Power States, beziehen sich jedoch speziell auf Prozessoren, welche hinsichtlich Energieverbrauch und Wärmeentwicklung eine besonders gewichtige Rolle in einem Computersystem spielen. Diese Zustände stellen wiederum eine Unterkategorisierung innerhalb des Global Working State G0 in Bezug auf die Prozessoren dar. Man unterscheidet folgende Abstufungen: • C0 Processor Power State: Dies ist der einzige Processor Power State, in welchem die entsprechende CPU Instruktionen ausführt. • C1 Processor Power State: In diesem Zustand werden keine Instruktionen ausgeführt und somit der Energieverbrauch reduziert. Die Latenzzeit um wieder nach C0 zu kommen ist nicht genau festgelegt, sie muss aber so gering sein, dass sie für das Betriebssystem keinen Grund für die nicht Verwendung von C0 darstellt. Softwareseitig hat dieser Zustand, außer dass keine Instruktionen ausgeführt werden, keine Auswirkungen. • C2 Processor Power State: C2 stellt gegenüber C1 einen erhöhten Energiespareffekt dar, wobei nun jedoch die maximal auftretende Latenzzeit um wieder nach C0 zu kommen über ein ACPI Firmware-Objekt bezogen werden kann und somit für das Betriebssystem als Entscheidungshilfe für den Eintritt in diesen Zustand herangezogen werden kann. Softwareseitig hat dieser Zustand wie C1 außer dass keine Instruktionen ausgeführt werden könne keine Auswirkungen. • C3 Processor Power State: In C3 wird nun der größte Energiespareffekt aber auch die längste Latenzzeit, welche wiederum über die ACPI Firmware bereitgestellt wird, erreicht. Außerdem 8 1.2. GERÄTEKONFIGURATION hat C3 die Konsequenz dass Sofwareseitig für Cache-Kohärenz gesorgt werden muss, da in diesem Zustand die Hardware dies nicht mehr gewährleistet. Device and Processor Performance State Performance States stellen eine Unterkategorisierung der aktiven Device- bzw. Prozessorstates D0 bzw. P0 hinsichtlich Energieverbrauch und somit Leistungsfähigkeit dar. P0 ist dabei der Zustand in dem ein Gerät bzw. Prozessor die maximale Leistungsfähigkeit und somit den höchsten Energieverbrauch hat. P1 - Pn (wobei maximal 16 Performace States möglich sind) stellen dann mit aufsteigender Nummerierung einen geringeren Energieverbrauch dar. 1.1.3 Einfluss von ACPI auf die Betriebssystemstruktur Durch ACPI wird dem Betriebsystem eine umfangreiche Möglichkeit geboten den Energieverbrauch eines Computersystems in Abwägung mit den Anforderungen und insbesondere der benötigten Performanz zu optimieren. Da jedoch ACPI nur die Schnittstelle ist, stellt es zwar eine Grundvoraussetzung für umfangreiches Powermanagement dar, überlässt es jedoch rein dem Betriebssystem diese Möglichkeiten entsprechend zu nützen. Damit das Betriebssystem dieser Anforderung nachkommen kann benötigt es eine entsprechende Abstimmung der Betriebssystemstruktur und insbesondere des Gerätemodells des Betriebssystems. Besonders entscheidend ist dabei eine Repräsentation der physikalischen Geräteabhängigkeiten durch das Gerätemodell des jeweiligen Betriebssystems. Diese Notwendigkeit ist unmittelbar einleuchtend wenn man bedenkt dass ACPI die Reihenfolge in der Geräte beispielsweise zum Zwecke des Energiesparens in einen Schlafzustand oder überhaupt ausgeschaltet werden rein dem Betriebssystem überlässt. Dadurch ist zwar einerseits sehr hohe Flexibilität gegeben, aber es ist zwingend notwendig, dass das Betriebssystem über die physikalischen Abhängigkeiten zwischen den einzelnen Geräten bescheid weiß. Um ein einfaches einleuchtendes Beispiel zu nennen, darf beispielsweise der PCI-Bus erst dann abgeschaltet werden, wenn für alle Geräte zuvor der jeweilige Kontext gespeichert wurde und diese abgeschaltet wurden. Aufgrund der üblichen hardwareseitigen Strukturierung von Computersystemen lassen sich diese Geräteabhängigkeiten in hierarchischen Strukturen darstellen. Eine derartige Struktur war und ist in vielen Betriebssystemen jedoch nicht vorgesehen. In Windows wurde deshalb mit Windows 2000 auf ein neues Treibermodell mit dem Namen WDM (Windows Driver Model) umgestellt, welches unter anderem eine derartige Hierarchie unter den Geräten vorsieht. Unter Linux soll das seit dem Kernel 2.6 eingeführte neue Gerätemodell, welches sich dem User als sys-Filesystem repräsentiert, diese Aufgabe erfüllen, ist jedoch trotz der Präsenz in der aktuellen stabilen Kernelversion noch nicht vollkommen ausgereift. [GG03][Qua04] Weiters ist es natürlich entscheidend, dass ein Betriebssystem einen ACPI AML Interpreter vorsieht und in die Betriebssystemstruktur integriert, sowie dass es gemäß der ACPI-Spezifikation Zugriff auf die ACPI-Firmware-Tabellen vorsieht. Die damit verbundene, nötige Integration in die Betriebssystem ist jedoch stark betriebssystemspezifisch und würde den Rahmen dieser Seminararbeit sprengen. 1.2 Gerätekonfiguration Wie der Name ACPI (Advanced Configuration and Power Interface) bereits verrät hat ACPI nicht nur das Ziel umfangreiches Powermanagement zu ermöglichen. Zusätzlich zum Powermanagement versucht ACPI eine einheitliche Möglichkeit zur Konfiguration von Motherboardgeräten festzulegen. Dazu werden über das ACPI-Interface Kontrollmethoden und Information bereitgestellt um dem Betriebssystem (OSPM) eine entsprechende Möglichkeit zur Konfiguration von Geräten insbesondere unter Berücksichtigung der Möglichkeit des dynamischen Hinzufügen und Entfernen von Geräten. 9 1.2. GERÄTEKONFIGURATION Dabei werden diese Motherboardgeräte über sog. ACPI Definition Blocks, welche von der ACPIFirmware exportiert werden, beschrieben. Insgesamt ergibt sich dadurch ein Hierarchischer Zusammenhang aller Geräte. Als wichtige Information für Plug & Play werden dabei die nötigen Hardwareressourcen welche die Geräte verwenden können, sowie Objekte zur Konfiguration dieser bereitgestellt. Für diese Konfigurationsmethoden kann wiederum das flexible Konzept der Beschreibung durch AML verwendet werden. Es sei an dieser Stelle noch erwähnt, dass diese von ACPI unterstützte Konfigurationsmöglichkeit nicht zwingend Verwendet werden muss sondern vor allem für Geräte welche sonst keine effiziente Möglichkeit zur Aufzählung und Konfiguration bieten. So besteht beispielsweise für PCI Geräte keine Notwendigkeit mittels der ACPI Konfigurationsmöglichkeiten aufgezählt zu werden. Auf diese Gerätekonfigurationsmöglichkeiten kann an in dieser Seminararbeit jedoch nicht im Detail eingegangen werden. Für eine ausführliche Behandlung dieses Themas sei an dieser Stelle auf die ACPI Spezifikation [CCC+ 04] verwiesen. 10 Kapitel 2 Hot Plugging 2.1 Allgemeines Unter Hot-Plugging versteht man das Einfügen eines Gerätes in ein laufendes Computersystem wobei die automatische Erkennung und Konfiguration erlaubt, dieses neu eingefügte Gerät ordnungsgemäß verwenden zu können. Umgekehrt erlaubt es ebenso das Entfernen eines Gerätes aus einem laufenden Computersystem mit automatischer Deinitialisierung im System. Um diese Forderungen sinnvoll erfüllen zu können bedarf es sowohl Maßnahmen von Seiten der Hardware als auch der Software (Betriebssystem). So sind im besonderen folgende Fähigkeiten für sinnvolles Hot-Plugging entscheidend [wik05b]: 2.1.1 Physikalische Voraussetzungen: Es muss physikalisch gesichert sein, dass das Einfügen bzw. Entfernen eines Gerätes über eine bestimmte Hardwareschnittstelle keine mechanischen und elektrischen Beschädigungen verursacht. Wobei man je nach Art der physikalischen Voraussetzungen oft auch zwischen Hot-Swapping vs. HotPlugging unterschieden wird, der Begriffsunterschied ist jedoch in der Literatur nicht konsistent definiert [lina]. Es ist aber ein prinzipieller Unterschied ob man physikalisch gesehen das Gerät ohne Bedenken jederzeit einfügen oder entfernen kann (wie twa bei USB) oder ob es vorheriger Vorkehrungen wie etwa das Abschalten der Energieversorgung für das Gerät bedarf (wie etwa bei üblichen hotplug-fähigen PCI Schnittstellen). Laut [lina] wird ersteres mit Hot-Swapping bezeichnet und letzteres mit Hot-Plugging. Aufgrund der inkonsequenten Trennung dieser Begriffe in der Literatur wollen auch wir diese Trennung nicht weiter verwenden, der prinzipielle Unterschied ist aber sehr wohl entscheidend. 2.1.2 Änderungssensitivität der Hardware: In modernen Computersystemen werden die meisten Geräte über umfangreiche Bussysteme in das System integriert. Eine entscheidende Vorraussetzung für das Hot-Plugging ist damit, dass der Bus das Einfügen und Entfernen von Geräten am Bus automatisch erkennt, was eine entsprechende Anforderung an das elektronische und logische Busprotokoll impliziert. 11 2.2. HARDWARESEITIGE SYSTEMINTEGRATION VON GERÄTEN 2.1.3 Eindeutige Geräteidentifkation: Um eine Verbindung von neu in das System eingefügter Hardware und einer softwareseitig für die Steuerung und Kontrolle dieser nötigen Softwarkomponente (Treiber) herstellen zu können, bedarf es einer Identifikation dieser Hardware. Ist eine derartiger Identifikation nicht möglich, so müssen aufwendig und technisch unsauber potentielle Treiber durchprobiert werden in der Hoffnung aufgrund charakteristischer Merkmale (z.B. Antwortverhalten über bestimmten Registern) der Hardware den richtigen Treiber zu finden. Ein Beispiel für eine derartige Identifikation wäre etwa die Vendor ID und Device ID welche ein Gerät eindeutig identifiziert. Treiber können nun ID’s angeben welche sie unterstützen, wodurch ein entsprechendes Mapping sichergestellt ist. 2.1.4 Betriebssystemunterstützung: Letztendlich muss das Betriebssystem fähig sein auf derartige hardwareseitige Änderungen entsprechend zu reagieren. Dies bedingt einerseits das Erkennen, wann neue Hardware eingefügt bzw. entfernt wurde, sowie andererseits das Feststellen um welche Hardware es sich handelt um schließlich einen entsprechenden Gerätetreiber für diese Hardware zu finden und in das System entsprechend einzugliedern. Moderne Bussysteme ermöglichen dabei eine asynchrone interruptgetriebene Benachrichtigung des Betriebssystems über Hardwarekonfigurationsänderungen was sinnvolles Hot-Plugging ermöglicht. Alte (Bus)Systeme konnten vom Betriebssystem jedoch nur durch aufwendiges Überprüfen des gesamten Systems auf Änderungen überprüft werden. 2.2 Hardwareseitige Systemintegration von Geräten Wie bereits im vorigen Kapitel verdeutlicht wurde bedarf es grundlegender Voraussetzungen durch die Hardware um technisch sauberes Hot-Plugging realisieren zu können. Um Hot-Plugging verstehen zu können ist es daher unumgänglich sich mit der hardwareseitigen Realisierung und Strukturierung von Computersystem auseinander zu setzen. Moderne Computersysteme sind in der Regel nach der Hub-Architektur strukturiert, welche in Abbildung 4 schematisch dargestellt ist. Durch das meist probrietäre Hub Interface ist dabei eine hohe Übertragungsgeschwindigkeit zu den über den ICH (I/O Controller Hub) angeschlossenen Geräten und Bussystemen gewährleistet. Der Arbeitsspeicher hingegen wird direkt über den MCH (Memory Controller Hub) verbunden wodurch eine besonders hohe Übertragungsrate zur CPU gewährleistet ist. Die Graphik welche ebenfalls eine besonders hohe Übertragungsrate benötigt ist entweder direkt in den MCH integriert, wobei man dann von einen GMCH (Graphics Memory Controller Hub) spricht oder über ein eigenes Interface mit dem MCH verbunden und (normalerweise AGP) in eine eigene Graphikkarte ausgelagert. Ziel dieses Kapitel soll es nun nicht sein detailliert auf die hardwareseitige Realisierung von Computersystem einzugehen, sondern vielmehr einen kurzen Überblick über die Art der Integration von Hardware zu geben, da sie das Kommunikationsmodell des Betriebssystemkernels mit der Hardware entscheidend prägt. Der Zugriff auf die Geräteregister erfolgt üblicherweise über spezielle IO-Ports oder durch Abbildung dieser Register auf Speicheraddressen (Memory-Mapped-IO), wobei die verwendete Technik vom jeweiligen Prozessor abhängt jedoch nichts am grundsätzlichen Konzept ändert, dass der Prozessor Zugriff auf die Register des jeweiligen Hardwaregerätes erlangt. Zur asynchronen Benachrichtigung der CPU über wichtige Ereignisse stehen hingegen Interruptleitungen zur Verfügung, welche über einen Interruptcontroller mit der CPU verbunden sind. Um eine entsprechende systematische Integration von Geräten in das System zu ermöglichen werden diese üblicherweise 12 2.2. HARDWARESEITIGE SYSTEMINTEGRATION VON GERÄTEN Abbildung 2.1: Hub-Architektur [har] über Bussysteme angeschlossen. Solche Bussysteme sind beispielsweise PCI (Peripheral Component Interconnect)oder USB (Universal Serial Bus). Beides sind intelligente Bussysteme welche insbesondere ein entsprechendes Konfliktmanagement bereitstellen und somit unter anderem die Treiberprogrammierung erleichtern. Es besteht jedoch grundsätzlich ein wesentlicher Unterschied im Ansprechen von Geräten über den jeweiligen Bus, welcher für unsere Betrachtung entscheidend ist. Nach [linf] unterscheidet man folgende Beide grundsätzlichen Konzepte: • Direktes Ansprechen der Geräte Ein Beispiel für diese Art der Gerätekommunikation ist der PCI-Bus. In diesem Falle legt der Bus zwar neben dem physikalischen und logischen Busprotokoll einige Verwaltungsaufgaben fest, wie etwa die Ressourcenverwaltung oder das Erkennen von neuen Geräten, jedoch werden die Geräte noch direkt angesprochen. So existiert etwa im Falle von Memory-Mapped-IO ein bestimmter Speicherbereich in welchen die Register des PCI-Gerätes abgebildet werden, moderne Bussystem erlauben dabei eine flexible Abbildung um Ressourcenkonflikte möglichst zu verhindern. • Kommunikation über Paketschnittstelle des Hostcontrollers Ein grundsätzlich anderer Ansatz ist jener welche beispielsweise bei USB verfolgt wird. Bei Bussen dieser Art hat die CPU keine Möglichkeit direkt auf die Register des jeweiligen Geräte am Bus. Stattdessen wird diese Aufgabe an den Hostcontroller delegiert, welcher über ein entsprechendes Busprotokoll mit den einzelnen USB-Geräten kommuniziert. Im Falle von USB handelt es sich dabei etwa um ein serielles Bussystem mit Baumstruktur. Die CPU hingegen kommuniziert direkt nur mit dem Hostcontroller, welcher für diese direkt ansprechbar ist. Für diesen Zweck sind spezielle Hostcontrollerinterfaces definiert, welche das nötige Kommunikationsprotokoll festlegen. Entscheidend 13 2.3. BEISPIELE FÜR HOTPLUGGING für unsere Betrachtung ist dabei dass sich durch diese Art der Systemintegration eine entsprechend saubere Abstraktion auf Treiberseite herstellen lässt. So gibt es einen Treiber, welcher für die Ansteuerung des USB-Hostcontrollers zuständig ist. Im Falle von USB und Linux ergibt sich dabei ein eigenes Subsystem (USB-Subsystem, usb-core). Von diesem Subsystem können nun Funktionen in Anspruch genommen werden, welche es ermöglichen ein bestimmtes Gerät logisch anzusprechen (abstraktere Schnittstelle) - der Core-Treiber kümmert sich dann um die entsprechende Kommunikation mit dem Hostcontroller welcher als Vermittler agiert. Weiters wird das USB-Subsystem vom Host-Controller über neu erkannte Geräte bzw. entfernte Geräte verständigt, wodurch ein sauberes Hotplugging ermöglicht wird. Der Core-Treiber bzw. das entsprechende Subsystem informiert dann potentiell zuständige Treiber über das neu erkannte Gerät bzw. stößt eine Suche nach einem passenden Treiber an. Aufgrund dieser Abstraktionsschicht lassen sich sehr komplexe Busse mit relativ einfachen Gerätetreibern realisieren, da diese lediglich eine logische Sicht auf das Gerät haben und sich nicht selbst um die Geräteerkennung kümmern müssen sondern darüber informiert werden. Besonders interessant für das Hotplugging ist dabei auch dass Geräte entsprechende Metainformationen über sich und ihre Schnittstellen bekannt geben, was für ein adäquates Finden von Treibern und eine passenden betriebssystemseitige Systemintegration äußerst entscheidend ist. Nachfolgend wird nun eine genauere Betrachtung dieser Bussysteme in Hinblick auf Hotplugging durchgeführt und auf Memory und CPU Hotplugging eingegangen. 2.3 Beispiele für Hotplugging Es gibt verschiedenste Geräte, welche hotpluggingfähig sind. Einige davon werden in den hier folgenden Kapitel beschrieben: 2.3.1 PCI PCI Hot Plugging wird ein immer wichtigerer Faktor für das PCI Bus System. Deswegen wird intensiev an dieser Technologie geforscht unter anderem von der „PCI Special Interest Group“, welche einen Standard für PCI Hot Plug liefern. (derzeit in Version 1.1) Über 900 Firmen sind Mitglieder in der SIG![sig] Auch Compaq ist einer der Spitzenreiter auf diesem Gebiet und Begründer der SIG, was man auch an der Anzahl von veröffentlichten Whitepapers sieht. Einige davon sind auch hier referenziert. Beim PCI Hot Plugging findet man oft 3 verschiedene Arten: • Hot Replacement: Hot Replacement ist das Austauschen eines Geräts mit einem identischem zum Beispiel im Falle eines Defektes. Dies ist der günstigste Fall, da hier keine anderen Treiber zum Einsatz kommen müssen. • Hot Upgrade: Ein vorhandenes Gerät wird durch ein anderes, unterschiedliches ausgetauscht, was auch den Austausch der Treiber im Betriebssystem nachsich zieht. • Hot Expansion: Hier wird an einem noch freien PCI-Slot ein Gerät hinzugefügt. Während die PCI Hot Plug Spezifikation der SIG nur die technischen Vorraussetzungen beschreibt, liefert Compaq auch eine Art Standard für die Implementierung der Hardware: Dabei ist es möglich, die Stromversorgung eines jeden PCI Slots einzeln zu steuern, was das Hotplugging ansich leichter macht, aber auch einen positiven Nebeneffekt hat: Fehler in der Stromversorgung beim Hotplugging 14 2.3. BEISPIELE FÜR HOTPLUGGING Abbildung 2.2: PCI Hot Plug Technologie [Com98] (z.B. Kurzschluss durch defekte Karte) können meist vom slot-spezifischen Controller abgefangen werden und wirken sich nicht auf das Gesamtsystem aus. Über ein User-Interface (oder durch Buttons an der Hardware bei neueren Serversystemen) kann dem Betriebsystem mitgeteilt werden, dass das Gerät im Slot aktiviert bzw. deaktiviert werden soll. Das Betriebssystem teilt dies nun dem Hot Plug Controller mit, welcher unter anderem die zum Slot gehörende Power Control informiert. Oft findet man für jeden Slot noch Status-LEDs vor, welche anzeigen, ob das Gerät entfernt werden darf, oder nicht. Eine vereinfachte Darstellung dazu in Abbildung 2.2 Beispiel: Compaq PCI Hot Plug Driver für Windows 2000 Server Die Verbindung zwischen User Interface, Betriebssystem und Hardwarecontrollern wollen wir nun noch ein bisschen genauer betrachten. Dazu verwenden wir die schematische Darstellung eines Compaq Drivers für ein Windows 2000 Server Betriebssystem. Der Treiber für die PCI Hot Plug Geräte steuert den Hardware Controller, welcher wiederum die einzelnen Slot Controller bedient. Zusätzlich ist der Hot Plug Driver eine Art Funktionsschicht zwischen den Windows Treibern und dem Kernel, welcher zusätzliche Funktionen bereitstellt und den Kernel mittles Events über Änderungen informiert.[Com99] Der Rest wird bereits von Windows zur Verfügung gestellt. Mittels Plug and Play Events und Request funktioniert die Kommunikation zwischen User- und Kernel Mode. Der User Mode PnP Manager liefert dann schon fertige Operationen, welche von den Applicationen verwendet werden. Diese müssen nicht, wie in Abbildung 2.3 gezeigt, ausschließlich von Microsoft stammen, da man durch die Win32 API auch selbst darauf zugreifen kann. 2.3.2 USB Der Universal Serial Bus (USB) ist ein Bussystem zur Verbindung eines Computers mit externen USB-Peripheriegeräten zum Austausch von Daten. Durch die relativ hohen möglichen Datenraten und die automatische Erkennung von Geräten und deren Eigenschaften ist der USB zum Anschluss fast aller Gerätearten von Maus und Tastatur bis zu Lautsprechern, Festplatten und Foto-Kameras vorgesehen. USB 1.1 wird von Windows ab Version 98se unterstützt, wobei aber bereits bei Windows 95 eine rudimentäre und sehr fehlerbehaftete Unterstützung für USB 1.0 vorhanden war. Windows 2000 mit Service Pack 3 und Windows XP (SP 1) unterstützen nun auch den neuesten Standard 2.0. 15 2.3. BEISPIELE FÜR HOTPLUGGING Abbildung 2.3: PCI Hot Plug Architecture für Windows 2000 Server [Com99] Linux unterstützt seit seiner Kernelversion 2.4 gängige USB Geräte, wobei aber auch schon bei früheren Kernelversionen (z.B. 2.2) USB Controller teilweise unterstützt wurden. Grundsätzlich können an einen USB Port bis zu 127 Geräte angeschlossen werden, was allerdings eher ein theoretischer Wert ist, da die Betriebssysteme meist schon viel früher überlastet sind. Der zweite große Vorteil neben den relativ hohen Übertragungsraten (z.B. USB 2.0 mit bis zu 480 MBit/s) ist, dass alle Geräte hot plugging fähig sind. Dies wird durch den Host Controller und die eigenen Adressierungs- und Sendestrategien verwirklicht. Ein weiterer Aspekt, warum USB so erfolgreich wurde, ist wohl die Tatsache, dass über diesen Anschluß Geräte bis zu einer Grenze von meist 100mA/Gerät bzw. 500mA/Port mit Strom versorgt werden können. Host Controller/Adressierung Die Realisierung des Hot Plugging liegt in der Architektur des Host Controllers. Da die USB Geräte sich einen seriellen Bus teilen, ist es Aufgabe des Host Controllers, diesen auf die Geräte aufzuteilen. Deswegen darf ein USB Gerät nur dann senden, wenn es vom Host Controller abgefragt wird. Entdeckt nun der Host Controller ein neues Gerät an einem Port, sendet er ein Reset an dieses, wodurch die Adresse auf 0 gesetzt wird. Es werden hier 7bit-Adressen verwendet, wodurch sich die möglichen 127 Geräte erklären lassen. Nach dem Reset versucht der Controller das Gerät zu identifizieren, wodurch das Betriebssystem die richtigen Treiber laden kann. Danach bekommt es eine eindeutige Adresse zugewiesen. Da immer nur ein Port mit noch nicht konfiguriertem Gerät aktiviert wird, kommt es zu keinen Adresskollisionen. Zusätzlich können noch so gennante Device-Deskriptor, welche z. B. die Hersteller- und Produkt-ID enthalten, abgefragt werden. Dies dient etwa zur Bestimmung der Geräteklasse. Damit nicht für jede Maus, Tastatur oder andere Standardgeräte ein eigener Treiber geladen werden muss, wurden verschiedene Geräteklassen eingefürt, welche generische Treiber enthalten, die für 16 2.3. BEISPIELE FÜR HOTPLUGGING alle Geräte einer Klasse die Grundfunktionen bieten. Dies hat den Vorteil, dass nicht jedesmal, wenn man zum Beispiel eine Maus an den USB-Port anschließt, für diese eine spezielle Maus ein Treiber installiert werden muss, sondern die Maus sofort mit ihren Grundfunktionen benutzt werden kann. Bietet ein solches Gerät noch Zusatzfunktion, welche nicht Standard für diese Klasse sind (z.B. Maus: weiter Funktionstasten), dann muss man allerdings den dazugehörigen Treiber installieren, falls man diese Zusatzfunktionen nützen will. [usb00][wik05c] 2.3.3 IEEE 1394/Firewire Anders, als oft angenommen, ist FireWire und IEEE 1394 nicht das selbe. IEEE 1394 ist ein Standard für ein Bussystem, welcher teilweise ähnlich, teilweise aber auch sehr unterschiedlich zu USB ist. FireWire ist der von der Firma Apple geprägter Markenname für eine in den Funktionen reduzierte Implementierung des Schnittstellen- und Protokollstandards IEEE 1394. Anfangs war der IEEE 1394 durch seine höhere Übertragungsgeschwindigkeit gegenüber USB im Vorteil, doch mit USB 2.0 wurde IEEE 1394a (mit 400Mbit/s) um 80 Mbit/s überholt. Allerdings gibt es auch bereits den Standard IEEE 1394b, welcher mit (zukünftigen) Geschwindigkeiten von bis zu 3200 Mbit/s auf sich aufmerksam macht. IEEE 1394 zeichnet sich ebenfalls wie USB durch hohe Hotplugging und Removal Fähigkeiten aus, wodurch wir es hier erwähnen wollen.[wik05a][app] Ähnlich wie bei USB funktioniert auch das HotPlugging unter FireWire. Da aber hier die Kommunikation nicht zentral gesteuert wird, sondern Geräte auch direkt miteinander kommunizieren können, ist es nötig, dass nach einem Hotplugging Event alle Geräte neu konfiguriert werden. Dies geschieht in 3 Phasen: Zuerst wird ein Reset versandt, worauf die Phasen „Tree-ID“ und „Self-ID“ folgen. Beim Tree-ID wird die Topologie der angeschlossenen Geräte bestimmt, wobei ein Rootknoten bestimmt und ein Baum mit Eltern und Kindports aufgebaut wird. Dabei ist ein Kind-Port immer mit einem Knoten verbunden der weiter vom Root-Knoten entfernt ist als der jeweilige Eltern-Port. In der SelfID Phase wird nun die locale Adresse bestimmt und mit den direkten Nachbarn kommuniziert. (vgl. dazu Routing Algorithmen) Die dabei gewonnenen Informationen werden mittels Broadcast an alle vorhandenen Knoten weitergegeben. Danach kann durch die gewonnenen Informationen über die Topologie direkt zwischen 2 Geräten kommuniziert werden.[Wef00] 2.3.4 Memory Hotplugging: Da vor allem bei wichtigen Serversystemen Stehzeiten sowohl einen hohen Image- als auch Geldverlust zur Folge haben können und größere Systeme sogar über 30 Minuten zum Reboot benötigen, wird vor allem bei solchen Systemen gefordert, einen Großteil der Hardware auch zur Laufzeit auszutauschen. Deswegen unterstützen neueste Betriebssysteme wie Windows Server 2003 Memory Hot-Add. Auch auf dem Linuxsektor laufen bereits einige Projekte, welche die Realisierung dieser Aufgaben in Angriff nehmen. Damit das Betriebssystem Memory Hotplugging unterstützen kann, muss natürlich die Hardware entsprechend dafür ausgelegt sein und das Bios dies unterstützen. Memory Hot-Add: Damit ein Betriebssystem Memory-Hotplugging unterstützen kann, muss das Bios gewisse Anforderungen erfüllen [Mic04]: • Das Bios muss eine Static Resource Affinity Table, kurz SRAT, zur Verfügung stellen, in welcher sich Informationen zum möglichen Speicher (als auch zu Prozessoren) befinden. 17 2.3. BEISPIELE FÜR HOTPLUGGING • Der Speicher muss in Memory Device Objects, wie in der ACPI Spezifikation 3.0 im Kapitel 9.13 beschrieben ist [CCC+ 04], definiert sein. • Das Bios muss natürlich auch das Betriebssystem informieren, welcher physischer Speicher zur Verfügung steht. (E820) Wird nun ein Speicherblock hinzugefügt, laufen folgende Schritte ab: • Das Bios muss das Betriebssystem informieren, dass Speicher hinzugefügt wurde. Dies geschieht über ein ACPI Notify auf das Memory Device Object, welches den Speicher beschreibt. • Nun muss das Betriebssystem überprüfen, ob das Memory Device Object anzeigt, dass der Speicher verfügbar ist. • Ist dies der Fall, müssen die Treiber (Plug and Play) für das Memory Device Object geladen werden. • Der Memory Manager wird vom Memory Device Object Driver informiert, dass sich der Speicherbereich geändert hat. • Anschließend wird der neue Speicher vom Memory Manager für das Betriebssystem verfügbar gemacht und kann nun normal verwendet werden. Static Resource Affinity Table [Mic03] Die SRAT enthalten Informationen über die Anordnung von Prozessoren und Speicher. Wobei es möglich ist, Prozessoren und Speicher in Domains einzuteilen, was bei verteilten Systemen zur Anwendung kommt. Außerdem kann hier Speicher als Hot Pluggable definiert werden, weshalb sie hier erwähnt werden. Aufbau: Die Static Recource Affinity Tabelle hat einen Header, welcher eine Signatur, Prüfsummen, ID’s und andere Headerinformationen enthält und genau 48 Byte lang ist. Danach folgen die eigentlichen Informationen, welche hintereinander in bestimmten Strukturen für die verschiedenen Informationen wie Prozessor oder Memorybereich angeführt sind. Siehe dazu Tabelle 2.1 Header Resource Allocation Structure[n] Größe (in Byte) 48 – Beschreibung Enthält eine Signatur, die Länge der gesamten Tabelle, eine Checksumme und IDs und verschiedene Revision-Flags. Nach dem Header folgt eine Liste von Structures, welche die Informationen zu den Prozessoren (für jeden Prozessor eine Structure) bzw. zu den Speicherbereichen. Tabelle 2.1: Begin der SRAT 18 2.3. BEISPIELE FÜR HOTPLUGGING Memory Affinity Structure: Für das Memory Hotplugging sind die Strukturen für die Speicherbereiche entscheidend. Dieser Typ von Struktur hat die Nummer 1 und ist 40 Byte lang. Zusätzlich ist hier eine Domain anzugeben, welche für NUMA Systeme wichtig ist. NUMA steht für Non Uniform Memory Acces und beschreibt Systeme, deren Prozessoren zu den Speicherbereichen verschieden günstige Zugriffsmöglichkeiten besitzten und deswegen ein Prozessor mit den günstigeren Memorybereichen in eine Domain eingeteilt werden, um die Performaz zu steigern. Falls es sich nicht um ein NUMA-System handelt, sollte in der Memory Affinity Structure der Wert nach der Länge bei 0 belassen werden. Zwischen 2 reservierten, aber unbenützten Bereichen wird der zu beschreibende Speicherbereich anhand seiner physikalischen Adresse (von - bis) angegeben. Dann folgt der für das Hotplugging entscheidende Flags: Byte 1 der Flags zeigt, ob der Speicherbereich verwendbar, also Enabled ( = 1) oder Disabled (=0) ist. Ist diese Flag auf 0 gesetzt, wird diese Memory Affinity Structure vom Betriebssystem einfach ignoriert, was die Erzeugung durch das BIOS vereinfacht. Das 2. Flagbyte zeigt, ob dieser Speicherbereich Hot Pluggable ist, oder nicht. Die letzten beiden Bytes der Flags sind nicht in Verwendung. Siehe dazu Tabelle 2.2 Größe (in Byte) 1 Type Length Proximity main 1 Do- 1 Reserved Base Address Low Base Address High Length Low Length High Reserved Flags 5 4 Reserved 8 Beschreibung 1 für Memory Affinity structure (0 wäre Processor Local APIC/SAPIC Affinity Structure) Wert 40, da Memory Affinity Structure ist 40 Byte lang. Hier kann die Zugehörigkeit zu einer Domain angegeben werden. (bei Einprozessorsystemen standardmäßig auf 0) 4 4 4 4 4 Hier stehen die für uns entscheidenden Informationen, ob der Speicherbereich benutzbar bzw. Hot Pluggable ist. Tabelle 2.2: Memory Structure in der SRAT Adressierung bei Memory Hotplugging (Nonlinear) Speicher muss nicht in der Reihenfolge der Speicherbänke hinzugefügt werden. Dies lässt allerdings das Problem entstehen, dass „Löcher“ (Bereiche, welche nicht benutzt werden) in der physikalischen Adressierung auftreten können. Der Speicher ist also nicht kontinuierlich vorhanden. Linuxsysteme benutzen eine mem_map, welche ein Array von page-Strukturen darstellt, wobei jede physisch vorhandene Page einen Eintrag in der mem_map benötigt. Würde man nun die mem_map einfach für die 19 2.3. BEISPIELE FÜR HOTPLUGGING maximal verfügbare Speichergröße anlegen, käme man bei kleinen Systemen schnell an die Grenzen des vorhandenen Speichers, da die mem_map 1% des dargestellten Speichers benötigt. Um dieses Problem zu lösen, wurde zu den 3 bisherigen Repräsentationen einer physikalischen Adresse (die Adresse selbst, die struct page bzw. die page frame nuber = Index der page in der mem_map) ein viertes Schema hinzugefügt, welches die lineare (also auf die physische Adresse bezogene) Page Frame Number in eine möglicherweise kleinere (Index der mem_map) umrechnet. Dies kann durch kleinere Sets erreicht werden. [HKC] Memory Hot-Removal Schwieriger als das Hinzufügen von Speicher ist das Entfernen des Speichers zur Laufzeit. Da der Speicher ja wichtige Daten und die laufenden Anwendungen bis hin zu Teilen des Kernels enthalten kann, müssen vor dem Entfernen des Speicherblocks die darin enthaltenen Pages gesichert werden. Der Speicherblock, welcher entfernt werden sollte, kann aber verschiedene Arten von Pages enthalten, welche unterschiedlich schwierige Routinen zum Verschieben der Pages benötigt. Clean Pages, also Seiten, welche nur eine Kopie von Daten der Disk darstellen, als auch swapped Pages (Seiten, welche bereits auf der Disk gesichert wurden) können leicht entfernt werden. Auch Pages, welche geswapped werden können, sind durch den Page-Allocator leicht verschoben. Der Unterschied zu den normalen Routinen liegt nur darin, dass ein ganzer Bereich freigemacht werden muss. Es darf also auch nicht derzeit freier Speicher auf dem zu entfernenden Block benützt werden. Abbildung 2.4: Das Verschieben einer Seite im Speicher [lhm04] Es gibt aber auch Pages, welche nicht verschoben werden können. (z.B. Teile des Kernels) Liegen nun solche Seiten im Speicherblock, welcher entfernt werden soll, kann dieser nicht zur Laufzeit entfernt werden. Würden diese Teile nun im ganzen Speicher verteilt liegen, also auf jedem Speicherblock ein gewisser Teil, dann wäre kein Block mehr Hot-Removal fähig. Aus diesem Grund muss der Page Allocator versuchen, diese Teile zu gruppieren. Somit versucht man, Removable Areas einzuführen, welche keine solchen wichtigen Seiten enthalten und deswegen Hot-Removalfähig bleiben. 20 2.4. SURPRISE REMOVAL VON HARDWARE 2.3.5 CPU Hot-Plugging: Die selbe Motivation, welche für Memory Hotplugging angeführt wurde, kommt auch beim Hotplugging von CPUs zur Geltung, wobei dies noch mehr ein Thema für große Serversysteme darstellt und noch mehr in der Entwicklung als in konkreten Realisierungen steckt. Auf dem Linuxsektor gibt es hier aber bereits vielversprechende Projekte welche sich mit diesem Thema beschäftigen. Auch hier muss man wieder zwischen Hot-Add und Hot-Removal unterscheiden, da das Hinzufügen einer CPU wieder einfacher ist, als das Entfernen. CPU Hot-Add Nachdem vom Bios ein Hotplug Event ausgelöst wurde, muss zuerst gesichert werden, dass kein zweites Hotplug Event gleichzeitig behandelt wird. Danach wird überprüft, ob die CPU verwendbar ist und auch noch nicht hinzugefügt wurde. Danach müssen Kernel-Threads (z.B. für den Scheduler der einen CPU,..) angelegt werden, welche die eine CPU bedienen. Dann wird die CPU in einer globalen cpu_online_map registriert, damit das System die CPU auch einsetzten kann. Nun müssen noch die neuen Kernel-Threads gestartet werden und das System darüber informiert werden, dass eine neue CPU online ist. Erst jetzt kann ein neues Hotplug Event verarbeitet werden. [osd04] CPU Hot-Removal Wesentlich schwieriger, als das Hinzufügen einer CPU ist das Entfernen einer solchen. Bevor überhaupt mit dem Entfernen einer CPU begonnen werden kann, muss das System für kurze Zeit eingefroren werden, damit dieser CPU nicht weitere Prozesse zur Verarbeitung zugeteilt werden, bis diese aus der cpu_online_map entfernt wurde. Wiederum muss sichergestellt werden, dass nur ein Hotplug Event gleichzeitig behandelt wird. (Ansonsten könnte z.B. passieren, dass sich 2 CPUs gegenseitig entfernen wollen!) Außerdem muss überprüft werden, dass nach dem Entfernen noch mindestens 1 CPU übrig bleibt. Sobald die CPU aus der cpu_online_map entfernt wurde, muss verhindert werden, dass diese noch mit dem System kommuniziert und Interrupts senden kann. Deswegen wird sie deaktiviert, bevor das System wieder weiterlaufen kann. Der Scheduler muss nun die Tasks aus der Workingqueue der zu entfernenden CPU an andere CPUs weitergeben. Außerdem werden nicht mehr benötigte Kernel-Threads (z.B. Workingqueue-Thread der CPU) gekillt und dass System darüber informiert, dass eine CPU entfernt wurde. Nun könnte das nächste Hotplugging Event bearbeitet werden. [osd04] 2.3.6 Node Hotplugging Unter Node Hotplugging versteht man das Hinzufügen/Entfernen ganzer Knoten zur Laufzeit wobei solch ein Knoten (ACPI Container) aus einer Kombination von CPUs, Speicher und I/O-Controllern besteht. [lhn04] 2.4 Surprise Removal von Hardware Ein weitaus größeres Problem, als das Hinzufügen von Hardware, stellt das unerwartete Entfernen von Hardware, zur Laufzeit dar. Ein Beispiel dazu wär das Entfernen eines USB-Sticks oder einer externen Festplatte, während darauf geschrieben oder davon gelesen wird, was im besten Fall nur einen Datenverlust aber auch zum Absturz des ganzen Systems führen kann, falls das Betriebssystem (bzw. der 21 2.5. FALLSTUDIE: LINUX HOT-PLUGGING Treiber) dies nicht richtig abfängt.[MT02] Eine Lösung dieses Problems wäre eine hardwareseitige Sperre, welche das Entfernen des Geräts nur dann erlaubt, nachdem dieses im Betriebssystem abgemeldet wurde. Diese Möglichkeit ist aber für die meisten Hotplugging-Geräte einfach zu umständlich und teuer, oder einfach nicht realisierbar.[Mic01b] Man denke nur daran, dass jeder USB-Port einen eigenen Sperrmechanismus besitzten müsste, welcher Softwaregesteuert funktioniert. Allerdings hilft dieser auch nicht, wenn zum Beispiel eine externe Festplatte durch Trennen der Stromversorgung „entfernt“ wird. Deswegen müssen Maßnahmen getroffen werden, um in solchen Fällen das System stabil zu halten. Dies sollte bereits bei den Treibern geschehen. Dort ist ein weiterer Ansatz, das Problem mit dem surprise removal von Hardware zu lösen, „sanity checks“ einzuführen. Dies ist aber auch nicht für alle Codeteile möglich, da dies die Treiber unglaublich aufblähen würde und diese dadurch sehr langsam werden würden. Deswegen muss hier abgewogen werden, wo ein solcher check sinnvoll ist und wo nicht. 2.4.1 Caching Strategien Bei Speichergeräten wird of Caching verwendet, um die Geschwindigkeit zu steigern. Es werden also die Daten nicht gleich auf das Gerät (USB-Festplatte, Speicherkarten, . . . ) geschrieben, sondern mit einer Kopie auf der Festplatte / Arbeitsspeicher gearbeitet. Dadurch wird der Nachteil von langsamen Verbindungen etwas aufgehoben. Erst später, wenn mehr Zeit dazu vorhanden ist, werden die Daten auf das Speichergerät geschrieben. Dies wird aber in Anbetracht von Suprise Removal zum Problem, da hier der Datenverlust (am Speichergerät) größer, als vielleicht nötig, ist. Deswegen sollte bei schnellen Datenspeichern wie IEEE 1394 Festplatten („FireWire“) generell davon abgesehen werden und auch bei anderen Geräten das bißchen Gewinn an Performanz, das höhere Risiko eines Datenverlustes rechtfertig. [Mic01b][Mic01a] 2.5 2.5.1 Fallstudie: Linux Hot-Plugging Traditionelle Geräteeinbindung unter Linux Eine generelle Philosophie hinter Unix bzw. Linux ist es, dem Benutzer über Filesysteme eine möglichst einfache und einheitliche Schnittstelle, sowohl zu physisch auf Speichermedien existente Dateien als auch zu Systeminformationen und Peripherie, zu bieten. So werden Geräte unter Linux traditioneller Weise über Gerätedateien, welche normalerweise unter dem Verzeichnis /dev angesiedelt sind, angesprochen. Diese Gerätedateien besitzen als Attribute eine 8 Bit breite Major-Device-Number sowie eine 8 Bit breite Minor-Device-Number. Dabei stellt die Major-Device-Number den Verweis zu einem Gerätetreiber im Kernel dar, welcher sich in der Initialisierungsphase unter der gleichen Nummer beim Kernel registriert hat. Die Minor-Device-Number stellt einen Parameter für den angesprochenen Treiber dar, dessen Interpretation jedoch grundsätzlich dem Treiber überlassen ist. Üblicherweise jedoch unterscheidet ein Treiber danach welches konkrete Gerät angesprochen werden soll. So wird beispielsweise bei einem IDE-Festplattentreiber die Minor-Device-Number zur Unterscheidung der Festplatten und Partitionen auf diesen verwendet. Der Zugriff auf ein Gerät über eine derartige Gerätedatei erflogt nun grundsätzlich mit den selben Systemcalls wie der Zugriff auf gewöhnliche Dateien. Der Kernel erkennt jedoch aufgrund eines Flags, dass es sich um eine Gerätedatei handelt und ruft nach dem Überprüfen der Filesystemzugriffsrechte die dem Systemcall entsprechende Funktion in dem mit der Major-Device-Number der Gerätedatei beim Kernel registrierten Treiber auf. Eine übersichtliche Darstellung der diesbezüglich interessanten Systemcalls kann [linc] entnommen werden. Traditionellerweise wurde nun ein Treiber entweder fix in den Kernel kompiliert oder 22 2.5. FALLSTUDIE: LINUX HOT-PLUGGING seit der Einführung der ladbaren Kernelmodule explizit durch entsprechende Scripte (etwa während dem Systemstart) bzw. durch den Benutzer über entsprechende Kommandos geladen. Zusätzlich muss sicher gestellt werden, dass für den Treiber eine entsprechende Gerätedatei (mit der gleichen MajorDevice-Number wie die mit der der Treiber beim Kernel reserviert ist) vorhanden ist bzw. erzeugt wird. Erschwerend kommt hinzu, dass viele Applikationen für Geräte ganz bestimmte Namen der Gerätedateien voraussetzen. Aus dem traditionellen Ansatz lassen sich folgende Fragen und Probleme erkennen: • Wie können vielseitige Funktionen moderner Geräte über einfache Dateizugriffe realisiert werden? • Mit 8 Bit breiter Major-Device-Number lassen sich theoretisch lediglich 256 Treiber und in Verbindung mit der Minor-Device-Number maximal 65536 Geräte ansprechen. • Wie kann ein Konflikt zwischen Treibern welche die selbe Major-Device-Number verwenden verhindert werden? • Hot-Plugging erfordert die durch ein Hot-Plugging-Ereignis getriebene Gerätekonfiguration was das genaue Gegenteil des benutzergetriebenen Laden von Gerätetreibern ist. Um die in einem modernen Linuxsystem vorhandenen Lösungen für die gerade angeführten Probleme verstehen zu können, bedarf es einer zumindest überblicksartigen Betrachtung des IO-Managemets im Linux-Kernel, was Gegenstand des nächsten Kapitels ist. 2.5.2 IO Management des Linux Kernels 2.6 Das IO Management ist jener Teil des Betriebsystemkernels, welcher für den Datenaustauch der Programme mit der Peripherie, also den Geräten, zuständig ist, wobei sich dessen Aufgaben im Wesentlichen in folgende Beide abstrahieren lassen: • Ein Interface für die systemkonforme Integration von Hardware anbieten. • Eine einheitliche Programmierschnittstelle für den Zugriff auf die Peripherie zur Verfügung zu stellen. Beide Aufgaben erfordern also die Bereitstellung einer entsprechenden Schnittstelle. Im ersten Fall zwischen Hardware und Betriebssystem im Zweiten hingegen zwischen Betriebssystem und den Applikationen. Um standardisierte Schnittstellen zu schaffen bedarf es dabei entsprechender Abstraktion. In frühen Unix Zeiten war die Sache relativ einfach. Dabei wurden Geräte grundsätzlich lediglich in zwei Kategorien unterschieden - Charcter Devices und Block Devices, wobei erstere nur reinen sequentiellen Zugriff erlauben, letzere hingegen zusätzlich ein freies Positionieren. Für heutige Computersysteme mit äußerst komplexen Geräten ist diese grobe Kategorisierung jedoch unzureichend. Aufgrund der Verschiedenartigkeit der Geräte, sowie der Art wie diese üblicherweise über Bussysteme an das Computersysteme angeschlossen sind, wurde das IO-Management des Kernels in unterschiedliche Subsysteme unterteilt, welche auf die jeweiligen Individualitäten abgestimmt sind. Beispiele für derartige Subsysteme sind: Character-Devices, Block-Devices, Netzwerk, SCSI , USB-Subsystem, PCI-Subsystem, . . . Aufgrund der Vielfalt der Subsysteme musste auch die Applikationsschnittstelle erweitert werden, wobei folgende Differenzierung gegeben ist: Standard-API (open, close, read, write und ioctl Systemcalls), Kommunikations-API, Card-Services und Multimedia-Interfaces (z.B. Video4Linux). Um nun jedoch das Systemcall-Interface nicht zu sehr erweitern zu müssen, sind die 23 2.5. FALLSTUDIE: LINUX HOT-PLUGGING Interfaces zumeist auf Basis standardisierter Datenstrukturen und IO-Controls realisiert. IO-Controls sind dabei über Dateideskriptoren ausgeführte Systemcalls namens ioctl, welche mit einer Kommandonummer und einen Zeiger auf einen Datenbereich zum Austausch standardisierter Datenstrukturen zwischen Applikation und Treiber parametriesierbar sind. Auf diese Art können äußerst flexible Interaktionen über Gerätedateien ermöglicht werden. Häufig ist auch der Fall, dass die hauptsächliche Interaktion mit einem Gerät nicht direkt mit einer Applikation erfolgt, sondern durch andere Kernelsubsysteme. Beispiele hierfür wären etwa Blockgeräte auf welchen über ein Filesystem zugegriffen wird (typischer Zugriff auf eine Festplattenpartition) oder der Zugriff auf Netzwerkgeräte über die Kommunikations-Stacks des Netzwerk-Subsystems. Im Falle eines Netzwerktreibers ist es also nötig, dass sich dieser beim Netzwerksubsystem anmeldet um über diesen Weg entsprechend der Intention in das System integriert zu sein [ling]. Ein Verständnis dieser grundsätzlichen Gliederung des IO-Managements in Subsysteme ist notwendig um den Ablauf von Hot-Plugging unter Linux verstehen zu können. Der Umfang dieser Seminararbeit erlaubt dabei natürlich nur eine übersichtliche Darstellung. Eine genauere Beschäftigung mit diesem Thema sowie der Treiberprogrammierung unter Linux 2.6 kann [linb] entnommen werden. Als nächstes wollen wir uns näher mit Treibern und deren Bezug zu den IO-Subsystemen unter Linux beschäftigen, da diese nach einem Hot-Plugging Ereignis für die meisten Geräte letztendlich die Kontrolle über diese übernehmen müssen und somit eine entscheidende Rolle für das Funktionieren von Hot-Plugging darstellen. 2.5.3 Treiber unter Linux Grundsätzlich können Treiber unter Linux entweder fix in den Kernel kompiliert sein oder durch ladbare Kernelmodule realisiert sein. Im ersten Fall spricht man auch von Built-in Treibern. BuitIn Treiber werden heutzutage meist nur noch für Geräte verwendet welche bereits beim Booten des Betriebssystems benötigt werden. Als Kernelmodule realisierte Treiber erlauben nämlich eine hohe Flexibilität des Systems und verhindern das der Kernel zu groß wird, außerdem ermöglichen Sie einen dynamischen Treiber-Entwicklungsprozess. Kernelmodule müssen nun keine Treiber sein. Treiber werden sie erst dadurch, dass sie sich während der Modulinitialisierung unter anderem mit einer eindeutigen Identifikationsnummer beim IO-Management des Kernels anmelden. Diese eindeutige Nummer entspricht traditionell der MajorDevice-Number unter welcher der Treiber infolge angesprochen werden kann. Aufgrund der bereits besprochenen Beschränkung dieser auf 8 Bit wurde dieses Konzept mit der Kernelversion 2.6 jedoch durch eine sogenannte 32 Bit breite Gerätenummer ersetzt, außerdem gibt es das Konzept der MinorDevice-Number nicht mehr. Es muss jedoch erwähnt werden, dass das neue Konzept der Gerätenummer zwar Kernelintern bereits realisiert ist, da jedoch Filesysteme und Applikationen noch mit dem alten Major/Minor-Device-Number-Konzept arbeiten wird vorübergehend eine eindeutige Abbildung dieser auf die Gerätenummern verwendet [lind]. Die Rolle der IO-Subsysteme beim Hot-Plugging Im traditionellen Ansatz war es die Aufgabe des Treibers während seiner Initialisierungsphase eine Hardwareerkennung nach von ihm unterstützer Hardware vorzunehmen. Entsprechend mussten die damit verbundenen Hardwareressourcen wie etwa IO-Ports, IRQ’s, IOMemorybereiche und DMA-Kanäle reserviert werden, um Konflikte zu vermeiden. Erst dann konnte ein Treiber die Hardware über die von ihm reservierten Ressourcen ansprechen. Nach diesem Ansatz wird also ausgehend von einer Konfiguration und einem Treiber nach einem entsprechenden Gerät gesucht. Es ist klar ersichtlich, dass dieser Ansatz das genaue Gegenteil zum Prinzip des Hot-Plugging 24 2.5. FALLSTUDIE: LINUX HOT-PLUGGING darstellt. Nach diesem versucht man ausgehend von einem neu entdeckten Gerät einen entsprechenden Treiber, eine Konfiguration und die nötige Systemintegration zu finden. Mit zunehmender Komplexität der Computersysteme ist es wie besprochen notwendig, das IO-Management in spezifische Subsysteme zu unterteilen. Eine ebenfalls für das Hot-Plugging entscheidende Unterteilung ist es dabei Subsysteme für die einzelnen Bussysteme, über welche üblicherweise Peripheriegeräte angeschlossen werden, zu schaffen. Diese Subsysteme (z.B. PCI-Subsystem) übernehmen nun das Erkennen von Hardware am entsprechenden Bussystem. Die Konsequenz daraus ist, dass es nun nicht mehr die Aufgabe der Gerätetreiber ist ihre unterstützten Geräte zu erkennen. Dadurch erleichtert sich die Programmierung der Gerätetreiber besonders auch dadurch, dass das Konfliktmanagement bezüglich der von der Hardware beanspruchten Ressourcen zentral in den Subsystemen gehalten werden kann, wobei moderne Bussystemen hierzu eine Hardware- bzw. Bios-seitige Lösung vorsehen welche das Subsystem unterstützt. Viel entscheidender für unsere Betrachtung ist jedoch, dass dadurch die Vorraussetzung für das Hot-Plugging geschaffen ist, nämlich ausgehend von der Erkennung bzw. Entfernung eines Gerätes einen entsprechenden Treiber für dieses zu initialisieren bzw. zu deinitialisieren. Im Linux Kernel wird dies nun dadurch realisiert, dass sich ein Hot-Plugging fähiger Treiber bei seiner Initialisierung beim entsprechenden Subsystem anmeldet. Entdeckt das Subsystem nun ein neues Gerät bzw. die Entfernung eines vorhandenen Gerätes meldet dieses dem Gerätetreiber über eine registrierte Callbackroutine dieses Ereignis und übergibt im Falle des Erkennens eines neuen Gerätes die nötigen Informationen zum Ansprechen des Gerätes. Der Gerätetreiber reserviert daraufhin die eventuell damit verbundenen Hardwareressourcen und initialisiert das Gerät - Treiber und Geräteinitialisierung sind nun also getrennt. Der genaue Ablauf für gängige Bussysteme wie PCI und USB kann dabei [ling] entnommen werden. Wie weiß das Subsystem nun aber welcher Treiber für das gefundene Gerät Unterstützung anbietet? An diesem Punkt kommt nun die im einleitenden Kapitel als Voraussetzung für sinnvolles Hot-Plugging angegebene eindeutige Geräte-Identifikation ins Spiel. So bieten moderne Bussysteme wie PCI und USB die Möglichkeit, dass Identifikationsdaten der angeschlossenen Geräte standardisiert bereitgestellt werden. Bei PCI ist dies beispielsweise die Vendor ID und Device ID, über welche die Hersteller Geräte kennzeichnen können. Wenn sich ein Treiber beim entsprechenden Subsystem registriert, werden dabei die vom Treiber unterstützten Geräte in Form derartiger Identifikationsmerkmale übergeben, wodurch das Subsystem Information über für ein erkanntes Gerät in Frage kommende Treiber erhält. Ein weiterer erschwerender Punkt ist dass es nicht reicht alleine Subsysteme für physikalisch unterscheidbare Bussysteme zu schaffen, da es auch abstraktere Konzepte gibt, die nicht auf der Ebene der direkten Verbindung zu einem Gerät abhandelbar sind. Typische Beispiele dafür sind etwa das Netzwerksubsystem über welches Netzwerkgeräte angesprochen werden oder das Blockgeräte üblicherweise über Filesysteme angesprochen werden. In diesen Fällen muss sich der Treiber ebenfalls bei dem entsprechenden abstrakten Subsystem anmelden, sodass über eine dabei entstehende Schnittstelle über ein solches abstraktes Konzept auf das Gerät zugegriffen werden kann. Die eigentliche Hardwareerkennung bleibt jedoch grundsätzlich gleich und wird vom Subsystem, welches für den entsprechenden physikalischen Bus zuständig ist, durchgeführt. 2.5.4 Zusammenspiel Hot-Plugging - UserSpace Bis jetzt haben wir uns rein mit der Kernel Ebene und dessen Erweiterung durch Module (Treiber) beschäftigt. Es gibt nun jedoch noch eine Menge von Aspekten welche sich nicht sinnvoll auf Kernelebene lösen lassen sondern eine Interaktion mit dem Userspace erfordern, um unter anderem höhere Flexibilität und Funktionalität zu ermöglichen. Nach [sf1]sind dabei folgende Aufgaben zu betrachten: 25 2.5. FALLSTUDIE: LINUX HOT-PLUGGING Treiber an Geräte binden Wie im vorigen Kapitel besprochen können die einzelnen Subsysteme bei Erkennen neuer Geräte aufgrund von Geräteidentifikationsmerkmalen geeignete Treiber auswählen. Damit dies funktioniert müssen diese jedoch geladen sein, ansonsten können diese nicht beim jeweiligen Subsystem registriert sein. Es bedarf also einer Lösung welche die nötigen Treiber in den Kernel lädt. Treiberspezifische Konfigurationsaufgaben Viele Treiber benötigen ein bestimmte Vorraussetzungen um ordnungsgemäß arbeiten zu können. Dies kann beispielsweise der Download von Firmware, das Starten eines zugehörigen Dämons oder die Bereitstellung bestimmter Konfigurationsparameter sein. Gerätespezifische Konfigurationsaufgaben Treiber können grundsätzlich für mehrere physische Geräte zuständig sein wodurch zusätzlich zu den treiberspezifischen Konfigurationsaufgaben für die nun tatsächlich behandelten Geräte hinzukommen können. Subsystemspezifische Konfigurationsaufgaben Diese Konfigurationsaufgaben beziehen sich gewöhnlich auf abstraktere Subsystem wie etwas das Netzwerk-Subsystem oder das Filesystem. Beispielsweise müssen Netzwerkschnittstellen entsprechend dem Netzwerkprotokoll konfiguriert werden (z.B. mit ifconfig für IP-Konfiguration aus dem Userspace). Ein anderes Beispiel wäre dass Speichergeräte in das Filesystem eingehängt werden müssen, da sie üblicherweise über diese angesprochen werden (mounten). Starten von Applikationen Oft ist es auch wünschenswert, dass als Reaktion auf Hot-Plugging Ereignisse Applikationen gestartet werden. So wäre es z.B. denkbar dass beim Anschließen einer Digitalkamera über USB eine Applikation zum Betrachten und speichern der Bilder auf der Kamera gestartet wird. Aus den angeführten Beispielen ist klar ersichtlich dass sich dies rein auf Kernelebene nicht sinnvoll lösen lässt. In Linux geht man deshalb den Weg, dass die Subsysteme des IO-Management HotPlugging Ereignisse auslösen, welche im Userspace behandelt werden können. Schematisch ist dies für den Fall eines neu entdeckten PCI-Gerätes und der Aufgabe einen Treiber für dieses Gerät zu laden in Abbildung 2.5 dargestellt: Das PCI-Subsystem im Kernel erkennt also ein neues Gerät und erzeugt für dieses ein HotpluggingEreignis welches im Userspace behandelt wir. Dabei wird es zuerst vom Hotplugging Multiplexer (Hotplug) an den dem Ereignis entsprechenden Hotplugging Agenten (pci.agent) weitergeleitet, welcher in diesem Beispiel einen benötigten Treiber lädt. Im folgenden Kapitel soll nun das Userspace Hotplugsystem unter Linux genauer betrachtet werden. Userspace Hotplugsystem unter Linux Wie im vorigen Kapitel erklärt wurde ergeben sich zahlreiche Aspekte wie auf ein Hotplugging Ereignis reagiert werden soll. In aktuellen Linux-Versionen wird dazu das Dreiergespann linux-hotplug, udev und HAL eingesetzt um eine entsprechende Integration von Hotplugging im System zu erreichen. Die standardmäßige linux-hotplug Implementierung basiert dabei auf dem Linux Hotplugging Projekt [sf1] und setzt sich grundsätzlich aus einem Ensemble aus Shell-Scripts und speziellen Konfigurationsfiles zusammen. Für die Erzeugung, Entfernung und Benennung von Gerätedateien sowie die 26 2.5. FALLSTUDIE: LINUX HOT-PLUGGING Abbildung 2.5: Hot-Plugging Mechanismus [line] Umbenennung von Netzwerkschnittstellen neu entdeckter bzw. entfernter Geräte wird zusätzlich ein spezielles System namens udev eingesetzt [KH03]. Zur Integration der Hardwareebene in die abstraktere System- und Desktop-level Software und der entsprechenden Reaktion dieser auf Änderungen in der Hardwarekonfiguration wird weiters HAL (Hardware Abstraction Layer) verwendet. Abbildung 2.6 macht den Zusammenhang dieser 3 Systeme deutlich, welche im Folgenden überblicksartig beschrieben werden. Hotplug (Linux Hotplugging Project) Zunächst ist es wichtig die Schnittstelle zwischen Kernel und Userspace zu erklären. Unter Linux in der Kernelversion 2.6 ruft dabei das HotpluggingSubsystem im Falle eines Hotplugging-Ereignisses jenes Userspace Programm auf, welches über das Pseudofilesystem /proc unter /proc/sys/kernel/hotplug angegeben wird. Dieser Wert wird üblicherweise durch die Startscripts beim Booten des Systems auf den gewünschten sog. Hotplugdaemon gesetzt. Diesem Hotplugdaemon wird dabei als Argument die Bezeichnung des initiierenden Kernelsubsystems übergeben (z.B. usb im Falle des USB-Subsystems). Außerdem wird über Umgebungsvariablen das Ereignis detaillierter charakterisiert. So wird z.B. für ein Ereignis des USB-Subsystems über eine Umgebungsvariable namens ACTION durch die Werte add bzw. remove festgelegt ob ein USB Gerät hinzugefügt oder entfernt wurde. Besonders interessant für eine adäquate Behandlung des Ereignisses sind im Falle von USB etwa auch die über die Umgebungsvariablen DEVPATH und DEVICE übergebenen Werte welche den Pfad zum Device-Eintrag im virtuellen sysfs-Dateisystem bzw. zum Konfigurationseintrag im virtuellen proc-Dateisystem enthalten. Sysfs ist dabei ein virtuelles Dateisystem welches seit der Kernelversion 2.6 über das neue Gerätemodell in den Linux-Kernel Einzug erhalten hat. Dieses neue Gerätemodell präsentiert sich dem Userspace eben über das sysfs, welches üblicherweise über /sys gemountet ist. Über dieses Filesystem werden dem Benutzer einer Vielzahl von Informationen über die dem Kernel bekannten Geräte, Schnittstellen und Treiber sowie deren Zusammenhang bereitgestellt. 27 2.5. FALLSTUDIE: LINUX HOT-PLUGGING Abbildung 2.6: Zusammenhang hotplug, udev, HAL [Zeu] Im Falle der Verwendung des Linux Hotplug Projektes wird nun /sbin/hotplug als derartiger Hotplugdaemon über dessen Eintrag in /proc/sys/kernel/hotplug eingehängt. /sbin/hotplug empfängt damit alle Hotplug Ereignisse des Kernels und übernimmt somit die Verantwortung über die weitere Behandlung des Ereignisses im Userspace. Im Folgenden wird nun diese von /sbin/hotplug ausgehende weitere Behandlung durch die flexible Struktur des Linux Hotplug Projekts anhand am Beispiel des Hotpluggings eines USB-Memorysticks veranschaulicht [Lum04]. 1. USB Memorystick wird vom USB-hub Treiber im Kernel erkannt. Folgende Kernel-loggingMeldung kann über /var/log/messages beobachtet werden. Jun 7 23:28:52 localhost kernel: usb 4-1: new high speed USB device using ehci_hcd and address2 2. Das USB-Subsystem im Kernel initiert ein Hotplugereignis. Der Kernel ruft in Folge dessen das unter /proc/sys/kernel/hotplug eingetragene Userspace Programm auf - also /sbin/hotplug. Dabei wird als Argument der String „usb“ übergeben (da vom USB-Subsystem im Kernel initiiert) sowie über Umgebungsvariablen das Ereignis detaillierter charakterisiert. 3. /sbin/hotplug multiplext das Ereignis entsprechend dem übergebenen Argument /sbin/hotplug selbst dient also nur als Multiplexer, wobei es alle Programme im Verzeichnis /etc/hotplug.d/usb (da usb als Argument übergeben wurde) sowie in /etc/hotplug.d/default (für jedes Subsystem) welche auf „.hotplug“ enden aufruft. Dabei wird wiederum das Argument von /sbin/hotplug übergeben und natürlich sämtliche Umgebungsvariablen vererbt. In der Standard hotplug-Installation wird für unser Beispiel des USB-Memorysticks dabei nur /etc/hotplug.d/default/default.hotplug ausgeführt, da der Ordner /etc/hotplug.d/usb leer ist. 4. /etc/hotplug.d/default/default.hotplug delegiert den Aufruf an /etc/hotplug/usb.agent /etc/hotplug.d/default/default.hotplug sucht nun nach entsprechenden agentScripts, welche folgende Pfadform haben /etc/hotplug/*.agent. Im Falle des Arguments usb wird 28 2.5. FALLSTUDIE: LINUX HOT-PLUGGING also der USB-Agent namens /etc/hotplug/usb.agent ausgeführt, welchem dann wieder die vererbte Umgebung bereitsteht. Diese drückt sich in den wesentlichen Umgebungsvariablen im Falle unseres USB-Memorysticks beispielsweise wie folgt aus: ACTION: add DEVPATH: /devices/pci0000:00/0000:00:10.3/usb4/4-1/4-1:1.0 DEVICE: /proc/bus/usb/004/003 INTERFACE: 8/6/80 PRODUCT: 41e/4129/1103 TYPE: 0/0/0 5. Der USB-Agent /etc/hotplug/usb.agent wird mit der Vererbten Umgebung aufgerufen Die entscheidenden Umgebungsvariablen für den USB-Agenten sind vor allem ACTION - anhand welchem entschieden wird was zu machen ist - und PRODUCT, INTERFACE und TYPE anhand welcher entschieden wird um welches Gerät es sich genau handelt und welche nötigen Aktionen sich dazu ergeben. Dabei ergeben sich folgende Unterschritte: (a) Nachdem $ACTION add ist werden nötige Kernelmodule geladen. Zu diesem Zweck wird die entsprechende von den modutils erzeugte Modul-Mappingdatei modules.usbmap (z.B.: /lib/modules/2.6.10-5-386/modules.usbmap) des Kernels nach passenden Modulen durchsucht welche dann geladen werden. Dabei enthält jede Zeile von modules.usbmap ein Modul, welches im Falle der Übereinstimmung der restlichen Attributwerte der Zeile mit dem Gerät welches unter Betrachtung steht, geladen werden soll. Für unser Beispiel ergibt sich dabei dass das Kernelmodul usb-storage mit all seinen Abhängigkeiten zu anderen Kernelmodulen geladen werden soll. (b) Als nächstes wird die Datei /etc/hotplug/usb.handmap, welche das gleiche Fromat wie modules.usbmap auf Übereinstimmungen für zu ladende Module überprüft. Diese Datei existiert dabei um Geräte die aus irgendwelchen Gründen nicht von den modutils auf Kernelmodule gemappt werden über diesen Weg zu laden. Zu beachten ist, dass diese Datei zum Umfang von hotplug gehört, die vorhin besprochene modules.usbmap jedoch zu den Kernelmodulen im Zusammenhang mit den modutils. (c) Als letztes erfolgt durch den USB-Agenten ein ähnliches Laden von Modulen gemäß den Dateien /etc/hotplug/usb.usermap und allen Dateien namens /etc/hotplug/usb/*.usermap. An diesen Stellen soll es dem Benutzer ermöglicht werden eigene Mappings für zu ladende Module bzw. zu startende Scripts in das Hotplugging System einzufügen. Dabei wird bei einer Übereinstimmung und im Falle dass der entsprechende Eintrag kein Kernelmodul bezeichnet das der Übereinstimmung gleichnamige Script in /etc/hotplug/usb ausgeführt. In unserem Beispiel wird hier keine Übereinstimmung gefunden 6. Die Ausführung kehrt zurück zum Kernel Es sei hier erwähnt dass die gerade ausgeführte Bearbeitungsreihenfolge die der Ereignisbehandlung für den erkannten USB-Memorystick an dem entsprechenden USB-Hub ist. Im Zuge des Hotpluggings des USB-Memorysticks treten jedoch eine Vielzahl von Ereignissen auf, welche alle eine entsprechende Behandlung erfahren. So emuliert etwa das Kernelmodul usbstorage einen SCSI Hostadapter und stellt über diesen Umweg den USB-Memorystick als SCSI Festplatte dar. Dadurch ergibt sich eine Reihe von Folgeereignissen, welche jedoch wiederum nach dem grundsätzlich gleichen Schema behandelt werden. Letztendlich muss auch noch eine 29 2.5. FALLSTUDIE: LINUX HOT-PLUGGING entsprechend benannte Gerätedatei erzeugt werden, damit im Userspace mit dem Gerät interagiert werden kann. Außerdem muss letztlich die emulierte SCSI-Festplatte gemountet werden und eine entsprechende Integration in die Desktopumgebung erfolgen. Für die Benennung, Erzeugung und Entfernung entsprechender Gerätedateien bzw. Umbenennung von Netzwerkschnittstellen wird nun udev verwendet, welches im Folgenden behandelt werden soll. udev (Linux configurable dynamic device naming support) Udev wird üblicherweise über ein Script namens /etc/hotplug.d/default/udev.hotplug in das Hotplug System eingehängt und somit wird diesem grundsätzlich die Behandlung jedes Hotplug-Ereignisses ermöglicht. Der Ansatz von udev ist dabei durch den Vergleich von Informationen, welche sysfs sowie das Hotplug System zur Verfügung stellen, mit vom Benutzer konfigurierten Regeln eine entsprechende flexible Benennungssystematik für Gerätedateien und Netzwerkschnittstellen bereitzustellen [SuS]. Eine genauere Behandlung des Konzepts von udev kann [KH03] entnommen werden, wobei insbesondere der Unterschied zu einer kernelbasierten Lösung wie etwa das ältere devfs aufgezeigt wird. Bevor udev nun Gerätedateien unter /dev erzeugt, liest es alle Dateien in /etc/udev/rules.d mit der Endung .rules in alphabetischer Reihenfolge ein. Die erste Regel, die zu einem Gerät passt, wird verwendet, auch wenn noch weitere existieren. Regeln haben dabei die Form: Schlüssel, [Schlüssel, ...] NAME [, SYMLINK] Über die Schlüssel kann nun die Voraussetzung definiert werden welche gegeben sein muss damit eine Gerätedatei mit dem angegebenen Namen sowie optional ein symbolischer Link zu dieser erzeugt wird. Die Schlüssel beziehen sich dabei etwa auf den Bustyp oder beliebigen Einträgen in sysfs. Genaueres kann dabei der Manpage von udev entnommen werden. Außerdem ruft udev in ähnlicher Weise wie hotplug Programme bzw. Scripts in /etc/dev.d/ auf wodurch entsprechende Benachrichtigungen bei Erzeugung bzw. Entfernung von Gerätedateien ermöglicht werden. Die Aufrufsystematik ist dabei auf 3 Ebenen gegeben: /etc/dev.d/DEVNAME/*.dev DEVNAME . . . Name der Gerätedatei/Schnittstelle /etc/dev.d/SUBSYSTEM/*.dev SUBSYSTEM . . . Subsystem des Hotplug Ereignisses /etc/dev.d/default/*.dev . . . Behandlungen für alle Ereignisse Ein Beispiel für ein derartiges Benachrichtigungsprogramm wäre etwa der HAL device name helper /etc/dev.d/default/hal.dev, über welchen HAL über neue bzw. entfernte Gerätedateien bzw. umbenannte Netzwerkschnittstellen benachrichtigt wird. Nach obigem Schema ist ersichtlich, dass dieses Programm für jedes Ereignis mit den entsprechenden Argumenten bzw. Umgebungsvariablen der Hotplug-Ereignisses aufgerufen wird. Die Intention von HAL besonders im Zusammenhang mit Hotplugging soll nun als nächstes behandelt werden. HAL (Hardware Abstraction Layer) Das Konzept von HAL besteht darin detaillierte Metadaten über Geräte zu verwalten und diese Applikationen auf System- und Desktopebene bereitzustellen, sowie asynchrone Benachrichtigungen über Änderungen in der Hardwarekonfiguration vorzunehmen. Dabei werden in HAL Geräte als sog. device objects dargestellt, welche eine eindeutige Identifizierung (UDI) und eine Menge von key/value Paaren haben welche in einen hierarchischen Namensraum eingeteilt sind und auch device properties genannt werden. Außerdem können device objects miteinander in Beziehung stehen, wodurch insbesondere eine Hierarchische Strukturierung der Geräteabhängigkeiten möglich ist. Eine detaillierte Betrachtung von HAL würde den Rahmen dieser Seminararbeit sprengen, weshalb an dieser Stelle auf [Zeu] verwiesen sei. Ziel dieses Abschnittes ist es einen Überblick zu geben und vor allem den Zusammenhang mit Hotplugging zu erläutern. Die grundsätzliche Architektur von HAL wird dazu in Abbildung 2.7 dargestellt. 30 2.5. FALLSTUDIE: LINUX HOT-PLUGGING Abbildung 2.7: Architektur HAL [Zeu] In Abbildung 2.7 als auch im Detail in Abbildung 2.6 ist ersichtlich das sowohl linux-hotplug als auch udev mit dem HAL daemon verbunden sind. Diese Verbindung erfolgt über den HAL hotplug helper sowie den HAL device name helper deren Aufruf entsprechend in den hotplugging Ablauf eingehängt ist (/etc/hotplug.d/default/hal.hotplug und /etc/dev.d/default/hal.dev). Diese beiden Helper Programme übernehmen im Falle eines Hotplug Ereignisse die entsprechende Benachrichtigung des HAL daemon über etwaige neue bzw. Entfernte Geräte bzw. neue bzw. Entfernte Gerätedateien oder Netzwerkschnittstellennamensänderungen. Wie aus Abbildung 2.7 ersichtlich ist, stellt der HAL daemon die zentrale Instanz in HAL dar. Der HAL daemon hält nun über eine Datenbank alle dem System bekannten device objects und deren Zusammenhang, wobei er insbesondere für das life cyle management dieser objekte Zuständig ist - also entsprechend über Änderungen in der Hardwarekonfiguration informiert sein muss um einen aktuellen Systemzustand repräsentieren zu können. Dazu besitzt der HAL daemon entsprechende Erkennungs- und Monitoringfähigkeiten für Busse (wie etwa PCI und USB) sowie Geräte und ist an die asynchrone Benachrichtigung über Hotpluggingereignisse angewiesen welche beispielsweise durch die Integration in linux-hotplug und udev erfolgen. Über dieses Prinzip ist nun eine abstrakte Schicht zur Beschreibung der Hardware geschaffen mit welcher eine bidirektionale Kommunikation mit der Anwendungs- und Systemsoftware erfolgt. Anwendungsprogramme kommunizieren dabei über D-BUS, was im Wesentlichen ein IPC (Interprocess communication) Framework darstellt, mit dem HAL daemon. Außerdem benachrichtigt (asynchron) der HAL daemon auf diesem Weg Anwendungen über Änderungen in der Hardwarekonfiguration. Weiter besteht die Möglichkeit zu sog. callouts, was Programmaufrufe in Folge von Änderungen an device objects sind. Diese callouts werden vor allem für Aktionen auf Systemebene verwendet. Beispiele dafür wären etwa das aktualisieren von Netzwerkschnittstellenkonfigurationen oder das einhängen von Dateisystemen. Wichtige Klienten von HAL sind natürlich besonders die Desktopmanagementsysteme wie etwa GNOME und KDE (Kommunikation über D-BUS). Durch Unterstützung 31 2.5. FALLSTUDIE: LINUX HOT-PLUGGING von HAL können diese Systeme beispielsweise deren Volumemanager konsistent halten, was sich z.b. dadurch zeigt, dass im Falle des Hotpluggings eine USB-Sticks ein entsprechendes Volume-Symbol am Desktop erscheint und etwa in einem Dateiordner dieses Volume automatisch geöffnet wird. Derartige Aktionen sind jedoch reine Policy-Entscheidungen der Desktopmanagementsysteme. Eigene Beurteilung des Userspace Hotplugsystem unter Linux Wie aus dem vorigen Kapitel ersichtlich wurde stellt das Hotplugsystem unter Linux im Userspace eine sehr komplexe und teilweise unübersichtliche Lösung dar. Die Hauptkritikpunkte welches sich aus unserer Sicht ergeben werden im Folgenden angegeben: • Übergang der Exekution vom Kernel in Shellscripts: Linux Hotplug besteht überwiegend aus Shellscripts. Dies ist einerseits aus Performancesicht bedenklich, da für jedes Hotplugereignis ein eigener Prozess gestartet werden muss, andererseits aufgrund der unstrukturierten Schnittstelle welche sich aus Positionsparametern und Umgebungsvariablen zusammensetzt. • Komplex: Insbesonders das Linux Hotplugging Projekt besteht aus sehr vielen Scripts die im wesentlichen die Informationen über Umgebungsvariablen weiterleiten. Aufgrund dieser Flexibilität kann man leicht den Überblick verlieren. Hier wäre eine unserer Meinung nach eine kompaktere und einheitlichere Lösung besser. Positiv sticht aus unserer Sicht HAL heraus, welches eine effiziente Kommunikation über D-BUS ermöglicht und klar das Prinzip der Abstraktion bei gleichzeitiger Flexibilität verfolgt. An dieser Stelle sei noch erwähnt, dass in aktuellen Distributionen wie etwa SuSe 9.3 bereits die Benachrichtigung des Userspaces über Hotplugereignisse mittels Netlink-Sockets zu einem Dämonprozess (udevd) erfolgt, wodurch erste Schritte in Richtung Effizienzsteigerung ersichtlich sind. Außerdem sorgt udevd für eine Bufferung und Serialisierung gemäß einer vom Kernel generierten Sequenznummer sodass die richtige Reihenfolge der Ereignisse garantiert wird. Udevd kümmert sich neben dem Herstellen der richtigen Reihenfolge weiters um die Verteilung an udev und linux-hotplug. Ubuntu 5.04 etwa verwendet ebenfalls udevd, jedoch wird dieser Dämon-Prozess durch das Programm /sbin/udevsend, welches im Falle eines Hotplugereignisses anstatt /sbin/hotplug aufgerufen wird, über Hotplugereignisse informiert. Die Entwicklung in diesem Bereich ist als sicherlich noch nicht abgeschlossen hat unserer Meinung nach eine viel versprechende Zukunft. 32 LITERATURVERZEICHNIS Literaturverzeichnis [app] Apple Developer Connection, Device http://developer.apple.com/devicedrivers/firewire/index.html. Drivers FireWire. [CCC+ 04] Hewlett-Packard Corporation, Intel Corporation, Microsoft Corporation, Phoenix Technologies, and Toshiba Corporation. Advanced Configuration and Power Interface Specifikation, Revision 3.0 Kapitel 3: ACPI Overview, September 2004. http://www.acpi.info. [Com98] Compaq Computer Corporation. PCI Hot Plug Technoligy, ftp://ftp.compaq.com/pub/supportinformation/papers/ecg0800698.pdf. Juni [Com99] Compaq Computer Corporation. PCI Hot Plug noligy with Microsoft Windows Architecture, März ftp://ftp.compaq.com/pub/supportinformation/papers/ECG0710399.pdf. 1998. Tech1999. [GG03] Andew Grover and Intel’s Mobile Products Group. Modern System Power Management, Oktober 2003. http://www.acmqueue.com/modules.php?name=Content&pa=printer_friendly&pid=81&page=1. [har] Elektronik-Kompendium. http://www.elektronik-kompendium.de/sites/com/0403311.htm. [HKC] Dave Hansen, Mike Kravetz, and Brad Christiansen. Hotplug Memory and the Linux VM. http://www.finux.org/Reprints/Reprint-Hansen-OLS2004.pdf. [KH03] Greg Kroah-Hartman. A Userspace Implementation of devfs, Proceedings of the Linux Symposium, July 2003. http://www.kroah.com/linux/talks/ols_2003_udev_paper/ReprintKroah-Hartman-OLS2003.pdf. [lhm04] Outline of Memory Hotplug, September 2004. http://lhms.sourceforge.net/outline.html. [lhn04] Linux Hotplug Node Support, September 2004. http://lhns.sourceforge.net/overview.html. [lina] http://wiki.linuxquestions.org/wiki/Hotplug. [linb] Linux-Treiber entwicklen. Gerätetreiber für Kernel 2.6 systematisch eingeführt. http://ezs.kr.hsnr.de/TreiberBuch/html/index.html. [linc] Linux-Treiber entwicklen. Gerätetreiber für Kernel eingeführt, Kapitel 4.1.: Programmierschnittstelle http://ezs.kr.hsnr.de/TreiberBuch/html/index.html. 33 2.6 der systematisch Applikation. LITERATURVERZEICHNIS [lind] Linux-Treiber entwicklen. Gerätetreiber für eingeführt, Kapitel 5.2.3. Gerätenummern http://ezs.kr.hsnr.de/TreiberBuch/html/index.html. Kernel 2.6 systematisch ersetzen Major-Nummern. [line] Linux-Treiber entwicklen. Gerätetreiber für Kernel 2.6 systematisch eingeführt, Kapitel 7.5.2. Hotplug. http://ezs.kr.hsnr.de/TreiberBuch/html/index.html. [linf] Linux-Treiber entwicklen. Gerätetreiber für Kernel 2.6 systematisch eingeführt, Kapitel 8.2. USB-Subsystem. http://ezs.kr.hsnr.de/TreiberBuch/html/index.html. [ling] Linux-Treiber entwicklen. Gerätetreiber für Kernel 2.6 systematisch eingeführt, Kapitel 8.3.: Netzwerk-Subsystem. http://ezs.kr.hsnr.de/TreiberBuch/html/index.html. [Lum04] Chris Lumens. Dynamic Hardware Configuration, http://www.bangmoney.org/presentations/hotplug/. September 2004. [Mes97] Hans-Peter Messmer. PC Hardwarebuch, chapter 11.5. Addison-Wesley Deutschland, 1997. Der SystemManagementMode des Pentium http://www.addisionwessley.de/service/Messmer/chap1104.htm. [MI96a] Microsoft and Intel. Advanced Power Management (APM) BIOS Interface Specification, Kapitel 1.3 Concepts, Febrary 1996. http://www.microsoft.com/whdc/archive/amp_12.mspx. [MI96b] Microsoft and Intel. Advanced Power Management (APM) BIOS Interface Specification, Kapitel 3: Advanced Power Management Software Layers, Febrary 1996. http://www.microsoft.com/whdc/archive/amp_12.mspx. [Mic01a] Microsoft Corporation. Removalbe Devices and Windows, December 2001. http://www.microsoft.com/whdc/system/pnppwr/hotadd/rem-devs.mspx. [Mic01b] Microsoft Corporation. Windows XP and Surprise Removal of Hardware, December 2001. http://www.microsoft.com/whdc/system/pnppwr/hotadd/XPrem-devs.mspx. [Mic03] Microsoft Corporation. Static Resource Affinity Table Version 1.2, March 2003. http://www.microsoft.com/whdc/system/CEC/SRAT.mspx. [Mic04] Microsoft Corporation. Hot Add Memory Support in Windows Server 2003, December 2004. http://www.microsoft.com/whdc/system/pnppwr/hotadd/hotaddmem.mspx. [MT02] Peter Monadjemi and Eric Tierling. Windows XP Professional - Profiwissen, Konfiguration, Netzwerke. Markt+Technik Verlag, 2002. [osd04] Hotplug CPU Documentation , September 2004. http://lists.osdl.org/pipermail/hotplug_sig/2004December/000097.html. [Qua04] Jürgen Quade. Linux-Treiber entwickeln, Gerätetreiber für Kernel 2.6 systematisch eingeführt. Kapitel 7.2.: Das neue Gerätemodell, 2004. http://ezs.kr.hsnr.de/TreiberBuch/html/index.html. [sf1] Sourceforge Linux Hotplugging hotplug.sourceforge.net/?selected=overview. 34 Projekt. http://linux- LITERATURVERZEICHNIS [sig] PCI Special Interest Group. http://www.pcisig.com. [SuS] SuSE. SuSE 9.3 Administrationshandbuch. Kapitel 19. Dynamische Device Nodes mit udev. [usb00] Universal Serial Bus Revision 2.0 specification, http://www.usb.org/developers/docs/usb_20_02212005.zip. Dezember 2000. [Wef00] Hans-Gerd Wefels. Lehrgebiet Technische Informatik 1: Der IEEE-1394Bus (FireWire), Fernuniversität Hagen, Januar 2000. http://www.stud.fernunihagen.de/q3004317/seminar1921/firewire.htm#_Toc473896488. [wik05a] Wikipedia Online Enzyklopädie: http://de.wikipedia.org/wiki/Firewire. IEEE 1394/Firewire, [wik05b] Wikipedia Online Enzyklopädie: http://en.wikipedia.org/wiki/Plug-and-play. Plug and Play, Mai 2005. May 2005. [wik05c] Wikipedia Online Enzyklopädie: USB, Mai 2005. http://de.wikipedia.org/wiki/Usb. [Zeu] David Zeuthen. HAL 0.5.2 Specification. http://www.freedesktop.org/Software/hal. 35