Beruflich Dokumente
Kultur Dokumente
Betriebssystem:Zusammenfassung
Betriebssystem:Zusammenfassung
2
1 Betriebssystementwicklung
1 Betriebssystementwicklung
1.1 Allgemein
• im fertigen System sind Fehler schwerer zu finden als in einem inkrementell entwickelten System
Emulator emuliert z.B. eine x86-CPU, eine VM hingegen führt Maschinencode auf der vorhandenen CPU
aus.
printf – Debugging
3
Debuggen mit
Software - Emulatoren
Debugger
4
1 Betriebssystementwicklung
Remote Debugging
Remote Debugging bietet die Möglichkeit Programme auf Plattformen zu debuggen, die (noch) kein inter-
aktives Arbeiten erlauben. Der Zielrechner kann auch ein Emulator sein. Vorausetzungen
• Kommunikationsverbindung(seriell, Ethernet, ...)
• Gerätetreiber
Bestandteile
• Debugging-Komponente auf dem Zielsystem (stub)
– sollte möglichst einfach sein
• Kommunikationsprotokoll
– spiegelt die Anforderungen an den stub wieder
– basiert (z.B) auf der Übertragung von ASCII Zeichenketten
Debugging Deluxe
Viele Prozessorhersteller integrieren heute Hardwareunterstützung für Debugging auf ihren Chips (OCDS
– On Chip Debug System), z.B. JTAG. Vorteile
• der Debug-Monitor (z.B. gdb stub) belegt keinen Speicher
• Implementierung eines Debug Monitors entfällt
• Haltepunkte im ROM/FLASH durch Hardware-Breakpoints
• Nebenläufiger Zugriff auf Speicher und CPU Register
• mittels Zusatzhardware ist zum Teil auch das Aufzeichnen des Kontrollflusses zwecks nachträglicher
Analyse möglich
1.4 Ihr hattet als Vorlage startup Assembler code gegeben. Was hat der so
gemacht?
5
– die normalen C/C++ Laufzeitbibliotheken können nicht benutzt werden. Andere haben wir
(meistens) nicht.
• generierte Adressen beziehen sich auf virtuellen Speicher!
– die Standardeinstellungen des Binders können nicht benutzt werden. Man benötigt eine eigene
Binderkonfiguration
• der Hochsprachencode stellt Anforderungen (Registerbelegung, Adressabbildung, Laufzeitum-
gebung, Stapel, ...)
– ein eigener Startup-Code (in Assembler erstellt) muss die Ausführung des Hochsprachencodes
vorbereiten
• Kontroller enthält Register über die mit ihm kommuniziert werden kann
• Brauchen Treiber im BS, die sich ihrer annehmen
• Müssen in der Interrupt-Vektor-Tabelle vom IO-Apic registriert werden, damit Interrupts überhaupt
im System ankommen (Plugbox)
plugin
Prologue
Epilog
• sema.v()
getKey
• sema.p()
• return key
• key invalidate
6
1 Betriebssystementwicklung
7
2 Interrupts
2.1 Allgemein
2.2 Wie läuft ein Interrupt ab und was macht ein Interrupthandler so?
Hardware-Seite
• Geräte - Kontroller zieht Interrupt-Leitung hoch
• Signal kommt beim IO-APIC an, welcher sich eine geeignete CPU ausshct (nach Programmierung:
Feste Zuordnung, Zufall, CPU welche am wenigste Arbeit gerade hat usw.)
• IO-APIC leitet das Signal an diese CPU weiter über den LAPIC; CPU-Interrupt-Pin auf high.
• IO-APIC legt Interrupt-Geräte-Nr auf Bus
• LAPIC führt Auswahl und Priorisierung durch
Behandlung eines Interrupts
• Automatisch von der CPU:
– schaltet in Kernmodus
– sichert PC und EFLAGS auf dem Stack
– schaltet Interrupts lokal aus
– Geräte-Nr als Index für Adresse im Speicher wo der Interrupt-Handler liegt
– dieser wird angesprungen
– Unterbrechungsvektor: Teil d. Speichers, wo Liste mit allen Routinen ist
• Unterbrechungsroutine wird ausgeführt
– Sichern der flüchtigen Register auf dem Stack durch den Assembler-Code
– Sichern der nicht flüchtigen Register auf dem Stack durch den compilten Hochsprachen-Code
– Aufruf Prolog - Behandlung der Interruptquelle damit nicht direkt wieder ein Interrupt ausgelöst
wird
– Acknowledge an den Lapic
– Aufruf unter Umständen des Epiloges
– Wiederherstellen der nicht flüchtigen Register durch den compilten Hochsprachen-Code
– Wiederherstellen der flüchtigen Register durch den Assembler-Code
– iret: Rücksprung zum Programm das davor gelaufen ist
8
2 Interrupts
push edx
push ecx //Interrupts sind per definition ausgeschaltet
push eax void guardian(uint32_t vector, cpu_context *context){
;; Pointer auf CPU
;; Kontext als 2tes Argument Gate *gate = plugbox.report((Plugbox::Vector)vector);
push esp
;; Int-Nr als 1tes Argument if( gate->prologue() ){
push %1 lapic.ackIRQ();
call guardian guard.relay(gate);
add esp,8 } else {
pop eax lapic.ackIRQ();
pop ecx }
pop edx }
iret
Listing 2: guardian function
Listing 1: IRQ-Entry
9
2.3 Wie funktioniert das Ebenenmodell?
Epilog: Softwareunterbrechung
10
2 Interrupts
Implementierung
• enter()
– Betreten der Epilogebene
– entspricht dem cli bei der harten Synchronisation
• leave()
– Verlassen der Epilogebene
– entspricht dem sti bei der harten Synchronisation
• relay()
– Anforderung eines Epiloges
– entspricht dem Hochziehen der IRQ-Leitung beim PIC
• queue
– Merken der Epiloge
– entspricht dem IRR (Interrupt-Request-Register) beim PIC
– Abarbeiten der gespeicherten Epiloge
– entspricht bei der harten Synchronisation dem Protokoll zwischen CPU und PIC
void enter(){
CPU::disable_int();
flag[system.getCPUID()] = true; void leave(){
CPU::enable_int(); Gate *gate;
bkl.lock(); CPU::disable_int();
}
while((gate =
void relay(Gate *gate){ queue[system.getCPUID()].
if(flag[system.getCPUID()]){ enqueue())){
if(gate->set_enqueued()){ CPU::enable_int();
queue[system.getCPUID()].insert(gate); gate->set_dequeued();
} gate->epilogue();
return; CPU::disable_int();
} }
flag[system.getCPUID()] = true;
CPU::enable_int(); bkl.unlock();
bkl.lock(); flags[system.getCPUID()] = false;
gate->epiloge(); CPU::enable_int();
leave(); }
}
Listing 4: leave function
Listing 3: enter/relay function
11
• Lost Update Problem, da Unterbrechungsbehandlung wieder Unterbrechbar: Flag nötig ob aktueller
Kern bereits das BKL hat (volatile bool, ints aus beim setzen)
2.6 Epilog macht das ganze jetzt langsamer. Warum macht man es dann?
Es geht darum die Zeit zu verringern, in der Interrupts komplett ausgeschaltet sind; Bei harter Synchroni-
sation ist dann zwar weniger Overhead, aber die Interruptsperre ist wesentlich länger (Breitbandwirkung).
Vorteile
Nachteile
• dass ein Prolog sich nicht selbst unterbrechen kann, da sonst endlose Schachtelung
• run to completion
• Bsp: E2 unterbricht E1 und haengt somit den Epilog frueher auf E05 ein
12
2 Interrupts
2.11 Was ist der AST und wofuer koennte man ihn nutzen?
Ein AST(asynchronous system trap) ist eine Unterbrechung, die (nur) durch Software angefordert werden
kann
• z. B. durch Setzen eines Bits in einem bestimmten Register
• ansonsten technisch vergleichbar mit einer Hardware-Unterbrechung
• AST wird (im Gegensatz zu Traps/Exceptions)asynchron abgearbeitet
• AST läuft auf eigener Unterbrechungsebene zwischen der Anwendungsebene und den Hardware-UBs
(E 12 )
Gesetzmäßigkeiten des Ebenenmodels gelten
• (AST-Ausführung ist verzögerbar, wird automatisch aktiviert, ...)
• Sicherstellung der Epilogabarbeitung wird damit sehr einfach!
• Abarbeitung der Epiloge erfolgt im AST; und damit automatisch, bevor die CPU auf E0 zurückkehrt
• bleibt nur noch die Verwaltung der anhängigen Epiloge
2.12 Die Netzwerkkarte schickt jetzt viele Interrupts was macht man
dagegen?
interrupt storms
13
– Unterbrechungsstürme erkennen
– das verursachende Gerät deaktivieren
– in den sogenannten polling mode schalten wenn die Anzahl der Interrupts einen bestimm-
ten Schwellwert überschreitet
• Geräte
– Interrupt rate limiting: das Gerät wartet einen programmierbaren Zeitabstand bevor es
wieder einen Interrupt generiert
2.13 Welche Interruptart gibt es noch, die man gar nicht haben will?
spurious interrupts
Ein technischer Mechanismus zur Unterbrechungsbehandlung birgt die Gefahr von fehlerhaften Unterbre-
chungsanforderungen.
Ursachen
• Hardwarefehler
• fehlerhaft programmierte Geräte
• elektrische Interferenzen (Übersprechen ?) auf einer Interrupt Leitung
Lösung
• Hardware- und Softwarefehler vermeiden
• Betriebssystem defensiv programmieren
– mit unechten Unterbrechungen rechnen
„Tejun’s patch also changes the way that the kernel responds to spurious interrupts - those which no driver
is interested in. Current kernels count the number of interrupts on each line for which no handler returned
IRQ_HANDLED; if 99,000 out of 100,000 interrupts are spurious, the kernel loses patience, disables the
interrupt line forevermore, and starts polling the line instead“
Mehrere Geräte können sich einen Interrupteingang teilen. Die Behandlungsroutine für einen solchen Inter-
rupt muss dann alle Treiber, deren Geräte diesen Interrupt ausgelöst haben könnten, aufrufen (am IRQ kann
dies nicht festgestellt werden). Dabei kann es zu Problemen kommen, wenn einzelne Treiber zu lange aktiv
sind, und in der Zwischenzeit im Gerät, welches den Interrupt ursprünglich ausgelöst hat, beispielsweise
der Puffer voll wird und überläuft. Im schlimmsten Fall führt dies zu einem Datenverlust.
Bei modernen Peripheriegeräten vergeben der Computer und das Betriebssystem selbst die IRQ-Nummern
(PnP = Plug-and-Play-Geräte); während bei alten Steckkarten, beispielsweise bei ISA-Karten, die IRQ-
Eingänge von Hand eingestellt werden müssen oder fest auf den Karten verdrahtet sind.
14
2 Interrupts
Erforderliche Abstraktionen
2.17 Thread-Vorbereitung
toc_settle bereitet den Stack nur vor. Eingetragen in das Stackpointerregister wird der dann erst in toc_go
und dann beim ret von toc_go springe ich in kickoff. Über der Adresse von kickoff liegt dann im Stack eine
Pseudo-Rücksprungadresse, die nie angesprungen werden darf - aber wir brauchen sie, damit der Stack
eben so aufgebaut ist, wie ein Stack eben immer aufgebaut ist, daher muss da halt ne Rücksprungadresse
liegen. Darüber liegt dann das Argument von kickoff und das ist dann der zu startende Faden.
15
3 Interprozesskommunikation
3.1 Lese/Schreiber-Problem
Abbildung 0.2: Leser-Schreiber Problem mit Semapho- Abbildung 0.3: Leser-Schreiber Problem mit Monitor
ren
16
3 Interprozesskommunikation
3.3 Wir haben da einmal shared memory und message passing kennen
gelernt. Was ist besser?
• beides ist gleich mächtig (das eine kann das andere emulieren)
• Shared Memory
– Umsetzung bei Paging durch Verwendung von gemeinsamen Seiten
– am schnellsten
– von zwei oder mehreren Prozessen wird ein bestimmter Speicherbereich gemeinsam benutzt
– das Kopieren zwischen Server und Clients ist nicht notwendig
– Synchronisation nötig, es sei denn bei atomaren Speicherzugriffen
– benötigt gemeinsamen Kern-Adressraum von isolierten Prozessen
• Message Passing
– Nachrichten werden von einem Prozess an eine Message Queue (verkettete Liste) geschickt
– dort kann die Nachricht von einem anderen Prozess abgeholt werden
– interaktion isolierter Prozesse
– einheitliches Paradigma für IPC mit lokalen und entfernten Prozessen
– ggf. Pufferung und Synchronisation
– Indirektion erlaubt transparente Protokollerweiterungen (Verschlüsselung, Fehlerkorrektur, ...)
3.4 Wie mache ich message passing, wenn ich shared memory habe?
Listing 5: mailbox
17
3.5 Wie mache ich shared memory wenn ich message passing habe?
Ermöglicht
• das Programmiermodell von Multiprozessoren auf Mehrrechnersystemen zu nutzen
• IPC über (virtuellen) gemeinsamen Speicher trotz getrennter Adressräume
Probleme
• Latenzen der Kommunikation und Trap-Behandlung: sehr langsam
• false sharing: Seitengröße entspricht nicht Objektgröße
18
4 Treibermodell
4 Treibermodell
4.2 Treiberinfrastruktur
19
4.3 Was sind die Vorteile von einem einheitlichem Treibermodell?
Wäre jeder Treiber einzigartig würde dies eine Erweiterung des E/A Systems für jeden Treiber erfordern.
Dies wäre ein unrealistisch hoher Aufwand bei der heutigen Gerätevielfalt. Folgt die Schnittstellennorm
einem übergreifenden standardisierten Modell, so bietet sie dem Betriebssystem oder der Anwendungs-
software die Möglichkeit, auch Geräte eines gänzlich unterschiedlichen Typs geordnet anzusprechen;
beispielsweise könnte eine Software zum Abspielen eines Musikstücks dann nicht nur einen Soundkarten-
Treiber verwenden, sondern auch die Tondaten über einen Netzwerktreiber versenden, da dieser ebenfalls
einen Datenstrom annehmen kann. Eine spezielle Anpassung der Anwendung an dieses Szenario ist so
nicht mehr nötig. Das übergreifende Schnittstellenmodell erleichtert die Programmierung der Anwen-
dungssoftware und ermöglicht einen universelleren Einsatz, auch mit noch unbekannten, zukünftigen
Gerätetypen.
4.4 Manche Treiber bieten auch mmap an. Was könnte das sein?
20
5 Betriebssystemarchitektur
5 Betriebssystemarchitektur
5.2 Allgemein
• Unterschied von Syscalls in Monolith und Mikrokern (Mikrokern langsamer, da zwei Adressraum-
wechsel in IPC: Anwendung → Kern und Kern → Serverprozess)
21
• Unterschied Usermodus/Systemmodus (Systemmodus hat privilegierte Operationen bspw. cli, Page-
tableeintraege in MMU aendern)
Da auf einem einzelnen Prozessor nur ENTWEDER das Betriebssystem ODER der Nutzerprozess laufen
kann, muss die Hardware des Computers in der Lage sein, die Operationen des Nutzerprozesses z.B. auf
die Verwendung gültiger Speicherbereiche zu überprüfen und notfalls das Betriebssystem zu aktivieren,
damit es dem Treiben ein Ende setzt. Dafür benötigt ein entsprechender Prozessor eine recht komplexe
Speicherverwaltungseinheit.
Für das Scheduling von Prozessen wird ebenfalls etwas Hardwareunterstützung in Form eines Timers benö-
tigt, der periodisch das Betriebssystem weckt, damit es gegebenenfalls einen Prozesswechsel durchführen
kann. Ohne so einen Timer kann man zwar auch ein Multiprozess-Betriebssystem realisieren, allerdings
müsste ein Prozess hier freiwillig den Prozessor freigeben. Das widerspräche dem Grundsatz, dass Prozes-
se sich nicht gegenseitig beeinflussen dürfen.
Der Ring, auch Domain genannt, bezeichnet (im Umfeld der Betriebssystem-Programmierung und des Mul-
titaskings) eine Privilegierungs- bzw. Sicherheitsstufe eines Prozesses. Diese schränkt den Prozess bezüg-
lich des auf der CPU nutzbaren Befehlssatzes und des verwendbaren Speicherbereichs gegebenenfalls ein.
Die Nutzung von Privilegierungsebenen ist sinnvoll, um die Hardware zu abstrahieren und um Prozesse
voneinander abzuschotten.
Im innersten Ring (höchste Berechtigungsstufe) läuft meist das Betriebssystem, evtl. sogar nur dessen Ker-
nel. Das Betriebssystem darf alles, insbesondere direkte Hardwarezugriffe und das Eingreifen in die RAM-
Bereiche anderer Prozesse. Anwendungsprogramme sind üblicherweise auf den äußersten Ring beschränkt
(niedrigste Berechtigungsstufe). Für Operationen, welche einen Hardwarezugriff erfordern, müssen An-
wendungsprogramme Betriebssystem-Dienste beauftragen. Der Befehlssatz wird für unprivilegierte Pro-
zesse („Userland“) derart eingeschränkt, dass sie nicht direkt auf die Hardware zugreifen können und sich
auch nicht aus ihrer Privilegierungsebene befreien können. Der Zugriff auf den Speicherbereich anderer
Prozesse wird meist durch Speichervirtualisierung verhindert. Somit wird gewährleistet, dass Prozesse z.
B. im Ring 3 in keinem Fall Prozesse im Ring 0 oder auch andere Prozesse im Ring 3 beeinflussen kön-
nen. Da die unprivilegierten Prozesse auf Hardware nicht direkt zugreifen können, existieren sogenannte
„Gates“ auf den darunterliegenden Ring, um auf der Programmierschnittstelle des Kernels die notwendigen
Aktionen anzufordern.
Die meisten Prozessor-Architekturen bieten nur zwei Ringe: Prozesse im Ring 0 befinden sich im Kernel-
Modus (kernel mode) – alle anderen im Benutzer-Modus (user mode). Die weitverbreitete x86-Architektur
bietet vier Ringe, von denen nur Ring 0 und Ring 3 verwendet werden. Hier werden Ring 0 und 1 dem
Betriebssystem zugerechnet, Ring 2 und 3 sind für Anwendungsprogramme vorgesehen. Jeder Wechsel von
einem Ring zum anderen erfordert in der CPU einen Kontextwechsel, der einige Rechenzeit in Anspruch
nimmt.
5.5 Mikrokerne
• Ziel: so wenig wie möglich im Kernmodus ausführen um hohe Ausfallsicherheit zu erreichen; Re-
duktion der Trusted Computing Base
– synchroner IPC, Kontextwechsel, CPU Scheduler, Adressräume
– no policies (abgesehen vom Scheduler)
22
5 Betriebssystemarchitektur
5.6 Exokerne
23
• Isolationsmechanismus: Addressräume; Ein Addressraum pro Anwendung + von ihr gebrauchter
Systemkomponenten
• Portabilität sehr hoch: fExokerne sind sehr klein
• Erweiterbarkeit sehr hoch: aber auch erforderlich! – der Exokern stellt kaum Funktionalität bereit
• Robustheit gut: Schutz wird durch den Exokern bereitsgestellt
• Leistung sehr gut: Anwendungen operieren nahe an der Hardware, wenige Abstraktionsebenen
5.8 Bibliotheksbetriebssysteme
• Zusammenfassung von häufig benutzen Funktionen zur Ansteuerung von Geräten in Software-Bibliotheken
• Teure Hardware wird nicht optimal ausgelastet
– Hoher Zeitaufwand beim Wechseln der Anwendung
– Warten auf Ein-/Ausgabe verschwendet unnötig CPU-Zeit
• Organisatorische Abläufe sehr langwierig
– Stapelbetrieb, Warteschlangen
– von der Abgabe eines Programms bis zum Erhalt der Ergebnisse vergehen oft Tage
• Keine Interaktivität möglich
– Betrieb durch Operatoren, kein direkter Zugang zur Hardware
– Programmabläufe nicht zur Laufzeit parametrierbar
• Systemfunktionen als normale Subroutinen
• Unterbrechungsmechanismus: Polling
• Interaktionsmechanismus: Funktionsaufrufe
• Isolationsmechanismus: nicht nötig, da Anwendung = System
24
5 Betriebssystemarchitektur
25