Interruptverarbeitung in Betriebssystemen
Sommersemester 2015 Prof. Dr. Peter Mandl
Prof. Dr. Peter Mandl Seite 1 Gesamtüberblick
1. Einführung in Computersysteme 2. Entwicklung von Betriebssystemen 3. Architekturansätze 4. Interruptverarbeitung in Betriebssystemen 5. Prozesse und Threads 6. CPU-Scheduling 7. Synchronisation und Kommunikation Interruptklassen 8. Speicherverwaltung
9. Geräte- und Dateiverwaltung Asynchrone Interrupts Synchrone Interrupts (nicht vorhersehbar und auch (vorhersehbar und auch 10. Betriebssystemvirtualisierung nicht reproduzierbar) reproduzierbar)
Exceptions Systemcalls (Software-Interrupts) Unterbrechung vor der Ausführung, Faults z. B. Page Fault = Seitenfehler
Unterbrechung vor der Ausführung, Traps z. B. Division durch 0
Prof. Dr. Peter Mandl Seite 2 Zielsetzung
. Konzepte und Abläufe der Interruptverarbeitung in Betriebssystemen kennenlernen und verstehen
. Unterscheidung der verschiedenen Interrupt- Klassen vornehmen können
. Ablauf eines asynchronen Interrupts erläutern können
. Ablauf eines (synchronen) Systemcalls erläutern können
Prof. Dr. Peter Mandl Seite 3 Überblick
1. Begriffe und Klassifizierung 2. Zusammenspiel der Komponenten 3. Systemdienste und Systemcalls
Prof. Dr. Peter Mandl Seite 4 Polling
Polling => Busy Waiting (aktives Warten) Gerät 1 while() { Ready-Bit for (alle Geräte) { if (Gerät[i].Ready-Bit == 1 ) { CPU Gerät 2 doAction(); Ready-Bit } … } } Gerät n Ready-Bit = 1 bedeutet, Gerät ist bereit, es sind Ready-Bit z.B. Daten abzuholen
Prof. Dr. Peter Mandl Seite 5 Interrupt
Interrupt = Unterbrechung = Trap
Abgrenzung zu Polling
- Kein aktives Abfragen von Ereignisquellen
Gründe für Interrupts:
- Betriebssystembedingungen
- Asynchrone Ereignisse
Verursacher: Hardware oder Software
Abschaltung (Maskierung) von Interrupts ist möglich, sollte aber für sehr kurze Zeit sein
Manchmal unbedingt erforderlich (siehe später Interrupt Service Routinen)
Prof. Dr. Peter Mandl Seite 6 Synchron und asynchron
Synchrone Interrupts: Von der CPU ausgelöste Ausnahmen (für das laufende Programm gedacht)
- Division durch 0
- Speicherzugriffsverletzung
Asynchrone Interrupts: Treten unabhängig davon auf, was das System gerade ausführt
- Netzwerkadapter meldet ankommende Nachricht
- Plattenspeicher meldet Zustellung eines Blocks
Prof. Dr. Peter Mandl Seite 7 Interrupt-Klassifizierung
Interruptklassen
Asynchrone Interrupts Synchrone Interrupts (nicht vorhersehbar und auch (vorhersehbar und auch nicht reproduzierbar) reproduzierbar)
Systemcalls Exceptions (auch als Traps oder Software- Interrupts bezeichnet)
Faults Unterbrechung vor der Ausführung, z.B. Page Fault = Seitenfehler
Unterbrechung nach der Ausführung, Traps z.B. Division durch 0
Prof. Dr. Peter Mandl Seite 8 Überblick
1. Begriffe und Klassifizierung 2. Zusammenspiel der Komponenten 3. Systemdienste und Systemcalls
Prof. Dr. Peter Mandl Seite 9 Interrupt-Bearbeitung: Zusammenspiel
Interrupts führen dazu, dass Code außerhalb des normalen Programmflusses ausgeführt wird
Steuerung wird an eine definierte Position im Kernel übergeben Interrupt-Service- Routine (ISR)
1: Gerät ist fertig Interrupt Festplatte 2: Interrupt Controller Clock CPU 3: CPU-Handling Tastatur Drucker
Bus
Prof. Dr. Peter Mandl Seite 10 Interrupt-Bearbeitung: Befehlszyklus
Prüfung, ob Interrupt anliegt, ist Teil des Befehlszyklus
Prüfung am Ende eines Maschinenbefehls
Fetch (Befehl aus Speicher holen)
Execute (Befehl ausführen)
Prüfung, ob Interrupt vorliegt Bei Multiprozessoren bzw. Mehrkernprozessoren: nein IRQ ja Dispatching eines Prozessors/Kerns Programmzähler notwendig, um anstehenden Interrupt auf Startadresse der ISR setzen zu bearbeiten
Prof. Dr. Peter Mandl Seite 11 Interrupt-Vektor-Tabelle und Adressierung
Interrupt Request (IRQ) wird vom Gerät gesendet und identifiziert das Gerät
Abbildung IRQ Int-Nr durch Hardware in einem Interrupt Controller
Int-Nr ist der Index für die Interrupt-Vektor-Tabelle (IVT)
Die IVT wird über die CPU adressiert
IVT-Aufbau durch Prozessor vorgegeben:
Bei Intel 256 IVT-Einträge für Exceptions, Systemcalls (Traps) und Geräteinterrupts
IVT IRQInt-Nr 0 Interruptvektor 1 Interruptvektor SVR 0 2 3 SVR 1 …
Prof. Dr. Peter Mandl Seite 12 Interrupt-Service-Routine (ISR)
Interrupt Anwendungsprogramm 1: Interrupt Usermodus Controller 2:
Ack Verteiler (Interrupt-Bearbeitung) 3: 4: Interrupt-Vektor- 5: - E/A-Geräte benachrichtigen die Tabelle CPU, wenn sie einen Dienst Kernelmodus 01 ISR1 02 benötigen 03 ISR2 ISR3 - Dadurch kann die CPU maximal n ausgenutzt werden, da sie parallel zur Ein-/Ausgabe etwas anderes ISRn machen kann
Adressraum ISR = Interrupt Service Routine
Prof. Dr. Peter Mandl Seite 13 Interrupt-Bearbeitung: Ablauf
Beliebiges ISR Programm Normale Programmbearbeitung Zeitpunkt des Interrupt
Laufender Maschinenbefehl wird noch zu Ende geführt. Registersatz wird auf den Stack gerettet. Adressierung über Interrupt- Vektortabelle Niedriger priorisierte Inter- rupts werden deaktiviert. ...
Alten Zustand wieder- Rückkehr Normale Programmbearbeitung herstellen (Register,...). fortsetzen
Prof. Dr. Peter Mandl Seite 14 Beispiel: Intel 8259A-Controller
Intel 8259A PIC = Programmable Controller = Multiplexer für Hardware-Interrupts - Ein integrierter Schaltkreis zur Verwaltung mehrerer Hardware- Interrupts - Aufgabe: Überwacht Interrupt-Leitungen (IRQ), speichert sie und gibt sie an die CPUs weiter - 8 Interrupt-Eingänge: Eingang 0 hat höchste Priorität - Seit IBM PC XT eingesetzt - Oft wurden zwei PICs in einem PC genutzt
Neuere Versionen - APIC = Advanced PIC mit 256 Interrupt-Eingängen wird bei x86- Architekturen eingesetzt - SAPIC = Streamlined Advanced Programmable Interrupt Controller wird bei IA64-Architekturen eingesetzt
Prof. Dr. Peter Mandl Seite 15 Gerät - Interrupt-Controller - CPU - Betriebssystem
Übertragung der Interrupt-Request-Nummer, Mapping IRQ Int-Nr.
IRQ 0 Gerät 1 D0-D7 Interrupt- Handling
IRQ 1 Betriebs- Gerät 2 CPU 8259A system ...
INT IRQ 7 Gerät 8 INTA
Prof. Dr. Peter Mandl Seite 16 Beispiel: Intel 8259A-Controller
Innenleben Intel 8259A, vereinfacht
8259A Interrupt- IRQ0-7 D0-D7 In-Service- Daten- Request- Register (ISR) bus- Register(IRR) Puffer
CPU
Interrupt-Masken- Register (IMR) INTR
Steuerlogik INTA
Prof. Dr. Peter Mandl Seite 17 Beispiel: Intel 8259A-Controller kaskadiert
CPU INTA (Bearbeitung durch CPU bestätigt) IRQ 0 0 timer output 1 keyboard
CPU 08 real time clock 09 s/w - int a0h IRQ 2 D0 – D7 10 reserved Intel 8259 Intel 8259 11 reserved (Adressierung des Interrupts) Master Slave 12 PS/2 mouse 13 coprocessor CPU INTR 14 hard disk IMR 15 reserved
03 serial 2 04 serial 1 05 parallel 2 INTA = Interrrupt Acknowledge INTR = Interruptmeldung an CPU 06 floppy IMR = Interrupt Mask Register 07 parallel 1 IRQ = Interrupt Request
PIC = Programmable Interrupt Controller
APIC = Advanced PIC
Prof. Dr. Peter Mandl Seite 18 Interrupt-Dispatching bei Mehrkernprozessoren
Dispatching-Algorithmus im Interrupt-Dispatcher wählt einen Kern aus, der den Interrupt bearbeiten soll
Kommunikationssystem
Local APIC Kern 1
Local APIC Kern 2 Interrupt Interrupt Dispatcher Interrupts (z.B. I/O-APIC Controller … im Chipsatz)
Local APIC Kern n
Mehrkernprozessor
Prof. Dr. Peter Mandl Seite 19 Fallbeispiel: Windows, Interrupt-Bearbeitung (1)
Interrupt-Service-Routinen
Asynchrone Interrupts
Ausnahme- Ausnahme- Hardware-Interrupt InHtearrnudplet-rService- Handler E/A-Geräte, Taktgeber Routine
Synchrone Interrupts
Ausnahme- Ausnahme- Systemcall Handler SyHsatenmdldeirenste
Ausnahme- Ausnahme- Exceptions (Traps, Abort) Ausnahmen HAaunsdnlearhme- verteiler Handler Busfehler, Stromausfall, Handler Division durch 0,...
Seitenfehler- Page Faults Handler
Prof. Dr. Peter Mandl Seite 20 Fallbeispiel: Windows, Interrupt-Bearbeitung (2)
Windows hat eine eigene Interrupt-Verwaltung
Über sog. Interrupt Request Levels (IRQL) ordnet der Kernel den Interrupts eigene Prioritäten zu
Nur Interrupts mit höherem IRQL können Interruptbearbeitung auf niedrigerem IRQL unterbrechen
Über eine Interrupt Dispatch Tabelle (IDT) wird festgehalten, welche ISR für welchen Interrupt zuständig ist
Prof. Dr. Peter Mandl Seite 21 Fallbeispiel: Windows, Interrupt-Bearbeitung (3)
Interrupt Request Levels (IRQLs) in der IA32- Architektur IRQL Bezeichnung Beschreibung 31 High-Level Maschinen-Check und katastrophale Fehler 30 Power-Level Strom/Spannungsproblem 29 IPI-Level Interprocessor Interrupt 28 Clock-Level Clock-Interrupt 27 Sync-Level Prozessorübergreifende Synchronisation 3-26 Device-Levels Abbildung auf IRQs der Geräte je nach verbautem Interrupt-Controller 2 Dispatch/DPC-Level Dispatching und Ausführung von Deferred Procedure Calls 1 APC-Level Ausführung von Asynchronous Procedure Calls nach Ein-/Ausgabe-Requests 0 Passive-Level Normale Threadausführung
Prof. Dr. Peter Mandl Seite 22 Fallbeispiel: Windows, Interrupt-Bearbeitung (4)
Interrupt Request Levels (IRQLs) in der x64- und der IA64-Architektur
IRQL Bezeichnung Beschreibung 15 High-Level Maschinen-Check und katastrophale Fehler 14 Power-Level Strom/Spannungsproblem und Interprozessor-Interrupt 13 Clock-Level Clock-Interrupt 12 Synch-Level Prozessorübergreifende Synchronisation 3-11 Device-Levels Abbildung auf IRQs der Geräte je nach verbautem Interrupt-Controller 2 Dispatch/DPC-Level Dispatching und Ausführung von Deferred Procedure Calls
1 APC-Level Ausführung von Asynchronous Procedure Calls
0 Passive-Level Normale Threadausführung
Prof. Dr. Peter Mandl Seite 23 Fallbeispiel: Windows, Interrupt-Bearbeitung (5)
Interrupt Controller Interrupt-Verteiler-Code Interrupt-Service- Gerät (8259A PIC) im I/O-System Routine (im Treiber)
1: Interrupt Request (IRQ) IRQ Int-Nr.
2: Int-Nr. weiterreichen 3: IRQL ermitteln und ISR- Adresse lesen 4: Interrupt Service Routine aufrufen 5: DPC-Eintrag Erzeugen und in IRQL als Index Queue einstellen
Interrupt I/O-System (Datenstrukturen Dispatch Table und Code) 01 02 03 Adresse DPC = Deferred (ISR) (verzögerter) n ... Procedure Call ...
... Abarbeitung in IRQL 2
Prof. Dr. Peter Mandl Seite 24 IRQL-Nutzung am Beispiel, Singleprozessor
IRQL DPC- Queue- Device3- 5 ISR 3 Anker Level DPC-Objekt IRQL 0-4 aus ISR3 maskiert Device2- 4 ISR 2 ISR 2 Level IRQL 0-3 DPC-Objekt aus ISR2 Device1- maskiert Level 3
Dispatch- DPC-Bearbeitung + Dispatching Level 2
APC- Level 1
Passive- Thread1 aktiv Thread1 aktiv Level t
Interrupt von Interrupt von Device 2 Device 3
Prof. Dr. Peter Mandl Seite 25 Fallbeispiel: Windows, Interrupt-Bearbeitung (6)
Bei x86-Systemen unterbricht der Interrupt- Controller (meist 8259-Baustein) die CPU auf einer Leitung (Hardware)
Die CPU fragt den Controller ab, um eine Unterbrechungsanforderung (IRQ) zu erhalten (Hardware)
Interrupt-Controller übersetzt IRQ in eine Interrupt- Nummer (Hardware)
Aus Interrupt-Nummer wird IRQL ermittelt (Software, Windows)
Die IDT enthält Adresse der anzustoßenden Interruptverteilroutine
Prof. Dr. Peter Mandl Seite 26 Fallbeispiel: Windows, Interrupt-Bearbeitung (7)
Interruptverteilroutine wird aufgerufen und ermitteln die Adresse der ISR
ISR wird aufgerufen
ISR erzeugt meist nur ein DPC-Objekt (Deferred Procedure Call) und hängt es in eine DPC-Queue ein - Kurze Bearbeitungszeiten in der ISR wird angestrebt - Kurze Bearbeitung in hoher Prioritätsstufe (IRQL) - Systembelastung gering halten
DPC-Routine wird dann später mit niedrigerer Priorität (IRQL = 2) aufgerufen und ist unterbrechbar(er)
Prof. Dr. Peter Mandl Seite 27 Fallbeispiel: Windows, APC-Bearbeitung (8)
APC = Asynchronous Procedure Call
Anwendungsbeispiel: - Bei read-Aufrufen an eine Festplatte wird die Threadbearbeitung zunächst unterbrochen - Nachdem der read-Aufruf vom Kernel abgearbeitet wurde, wird ein APC-Objekt erzeugt und in die APC-Queue des rufenden Threads eingehängt - Die nachfolgende Bearbeitung der APC-Queue erfolgt dann mit IRQL 1
Je eine APC-Queue pro Thread im Kernel- und im Usermodus, je nachdem, von wo der read-Aufruf abgesetzt wurde Hinweis: Threads sind leichtgewichtige Prozesse (später mehr dazu)
Prof. Dr. Peter Mandl Seite 28
Fallbeispiel: Linux
Linux nutzt auch eine Tabelle mit Referenzen auf die Interrupt-Handler (ISR)
Jeder Interrupt-Request wird auf eine Interrupt- Nummer (= Index in der Tabelle) abgebildet
Meist wird in der ISR nur ein Tasklet erzeugt
Tasklets dienen der schnellen Behandlung von Interrupts (ähnlich dem Windows-DPC- Mechanismus)
Prof. Dr. Peter Mandl Seite 29
Fallbeispiel: Linux, Interrupt-Vektor-Tabelle
Die Interrupt-Vektor-Tabelle ist im System wie folgt definiert:
extern irq_desc_t irq_desc [NR_IRQS];
Aufbau eines Tabelleneintrags:
typedef struct { unsigned int status; // IRQ-Status hw_irq_controller *handler; // Zeiger auf verantwortlichen // Controller struct irqaction *action; // Zeiger auf Action-Liste unsigned int depth; // Spezielles Feld zum Aktivieren und // Deaktivieren des IRQ } ____cacheline_aligned irq_desc_t;
Prof. Dr. Peter Mandl Seite 30
Fallbeispiel: Linux, Action-Liste
action = Action-Descriptor, Struktur mit Verweis auf eigentliche ISR
Verkettete Liste
struct irqaction {
// Verweis auf Interrupt-Service- // Routine void (*handler)(int, void *, struct pt_regs *);
unsigned long flags; // Eigenschaften des Interrupt-Handlers const char *name // Name des Interrupt-Handlers void *dev_id; // Eindeutige Identifikation des // Interrupt-Handlers struct irqaction *next; // Verweis auf nächsten Eintrag in der // Action-Liste };
Prof. Dr. Peter Mandl Seite 31
Fallbeispiel: Linux, Datenstrukturen im Kernel
Abstrakter Interrupt- Controller (konkret Interrupt-Vektor- z.B. PIC8259A) Tabelle hw_irq_controller irq_dec_t *handler irq_dec_t .... *enable ... *disable irq_dec_t *startup ... *action
Action-Descriptor irqaction *next irqaction .... *handler name *handler *next ... ISR
Prof. Dr. Peter Mandl Seite 32 Überblick
1. Begriffe und Klassifizierung 2. Zusammenspiel der Komponenten 3. Systemdienste und Systemcalls
Prof. Dr. Peter Mandl Seite 33 Wiederholung: Interrupt-Klassifizierung
Interruptklassen
Asynchrone Interrupts Synchrone Interrupts (nicht vorhersehbar und auch (vorhersehbar und auch nicht reproduzierbar) reproduzierbar)
Systemcalls Exceptions (Software-Interrupts)
Faults Unterbrechung vor der Ausführung, z.B. Page Fault = Seitenfehler
Unterbrechung nach der Ausführung, Traps z.B. Division durch 0
Prof. Dr. Peter Mandl Seite 34
Dienste des Betriebssystems
Anwendungsprogramme nutzen die Dienste des Betriebssystems, die über sog. Systemcalls aufgerufen werden
Wohldefinierte Einsprungpunkte ins Betriebssystem
Spezieller Aufrufmechanismus für einen Systemcall - Software-Interrupt (als Trap bezeichnet) oder Supervisor Call (SVC) - Vorteil: Anwendungsprogramm muss Adressen der Systemroutinen nicht kennen
Alle Systemcalls zusammen bilden die Schnittstelle der Anwendungsprogramme zum Betriebssystemkern - Zugang zu Systemcalls wird meist in Bibliotheken bereitgestellt
Prof. Dr. Peter Mandl Seite 35
Umschaltung in den Kernelmodus
Systemcalls werden im Kernelmodus ausgeführt
Beim Aufruf wird durch den Prozessor vom Usermodus in den Kernelmodus umgeschaltet
Anwendungssoftware,...
open() close() mount()
Betriebssystemkern
Prof. Dr. Peter Mandl Seite 36
Systemcall-Ablauf
Befehlsfolge eines Systemaufrufs
t Programm- System Programm- Code eines instruktionen Call instruktionen Anwendungsprogramms
Softwareinterrupt Zurück vom Kernel Mode Parameter auf Stack legen Ergebnis vom Stack holen PC Adresse (Systemroutine) PC Adresse (nach Systemcall) Umschalten auf Kernel Mode Umschalten auf User Mode
Betriebssystemkern
Prof. Dr. Peter Mandl Seite 37
Systemcall-Ablauf unter Linux/x86-CPUs (1)
x86-Befehl: int n // Aufruf des Interrupts mit der Interrupt-Vektor-Nummer n int $0x80 // Trap, Systemcall
C-Code:
main() { open(“mandl.txt“,1); // Datei zum Lesen öffnen }
Maschinencode: (gcc-Compiler):
.LCO: .string “mandl.txt“ .text .globl main main: ... call open ...
Prof. Dr. Peter Mandl Seite 38
Systemcall-Ablauf unter Linux/x86-CPUs (2)
Open-Routine in der Linux C-Library:
__libc_open: ... mov 0xc(%esp,1), %ecx // Parameter für Open in Register laden mov ... mov $0x5, %eax // Systemcall-Code für open-Funktion int $0x80 // Systemcall ...... iret // zurück zum Aufrufer
Interrupt-Vektor-Nummer $0x80 ist Index für die Adressierung der Interrupt-Vektor-Tabelle (IVT)
Prof. Dr. Peter Mandl Seite 39
Systemcall-Ablauf unter Linux/x86-CPUs (3)
int $0x80 Usermodus
IVT Kernelmodus
Systemcall-Tabelle (syst_call_table) … Verteiler
… … SVR
IVT = Interrupt-Vektor-Tabelle,
SVR = Serviceroutine, bearbeitet Systemcall
Systemcall-Tabelle verweist auf Implementierungen der Systemdienste Prof. Dr. Peter Mandl Seite 40 Systemcall-Ablauf unter Linux: Sequenzdiagramm
Anwendungs- Kernel- Systemcall-Impl. C-Library programm Verteilroutine für open()
1: open()
2: int 0x80 (EAX=5,...)
3: Adresse open-Routine = Systemcall-Tabelle[EAX]
4: Aufruf der open-Routine 5: Open- Ausführung 6: return
7: return
8: return
Usermodus Kernelmodus
Systemcall-Tabelle enthält alle Verweise auf Systemcalls (struct sys_call_table)
Prof. Dr. Peter Mandl Seite 41
Vergleichbare Befehle in anderen Prozessoren
EPC-Befehl = Enter Privileged Mode in IA64 - Übergabe von max. 8 Parametern in Registern und die restlichen Parameter im Kernelstack
syscall-Befehl in x64 - Übergabe der Systemcall-Nr. im EAX-Register - Max. 8 Parameter in Registern und die restlichen Parameter im Kernelstack
sysenter-Befehl in x86 Pentium II
SVC-Befehl in ARM-Architektur - früher SWI = Software-Interrupt
Prof. Dr. Peter Mandl Seite 42
Systemcalls bei POSIX
Systemcalls sind standardisiert in IS 9945-1
POSIX-Konformität erfüllen die meisten Unix- Derivate
Beispiele: - fork(): Prozesserzeugung - execve(): Aufruf eines Programms - exit(): Beenden eines Prozesses - open(): Datei öffnen - close(): Datei schließen - read(): Daten aus Datei lesen - write(): Daten in Datei schreiben POSIX = Portable Operating System Unix
Prof. Dr. Peter Mandl Seite 43
Systemcalls bei Win32-API
In Windows-Systemen sind die Systemcalls in der Windows-API (Application Programming Interface) definiert
Es gibt einige 1000 API-Funktionen, einige davon sind Systemcalls
Beispiele: - CreateProcess() Prozesserzeugung - exitProcess(): Beenden eines Prozesses - CreateFile(): Erzeugen und Öffnen einer Datei - CloseHandle(): Datei schließen - ReadFile(): Daten aus Datei lesen - WriteFile(): Daten in Datei schreiben
Prof. Dr. Peter Mandl Seite 44
Systemcall-Ablauf unter Windows
Windows- Anwendung Win-API
int, epc, syscall, Usermodus sysenter Systemdienst- schnittstelle Kernelmodus
Systemservice- Dispatcher (KiSystemService) Systemservice- Routine
Prof. Dr. Peter Mandl Seite 45 Überblick
1. Begriffe und Klassifizierung 2. Zusammenspiel der Komponenten 3. Systemdienste und Systemcalls
Prof. Dr. Peter Mandl Seite 46 Zusammenfassung Interruptverarbeitung
Polling und Interrupts
Synchrone und asynchrone Interrupts
Interrupt-Requests (IRQ) und Interrupt-Bearbeitung
Interrupt-Vektor-Tabelle (IVT) zur Adressierung von Interrupt-Service-Routinen (ISR) für synchrone und asynchrone Interrupts
Systemcalls = synchrone Software-Interrupts, (oft auch, etwas verwirrend als Traps bezeichnet)
Prof. Dr. Peter Mandl Seite 47 Gesamtüberblick
Einführung in Computersysteme Entwicklung von Betriebssystemen Architekturansätze Interruptverarbeitung in Betriebssystemen 5. Prozesse und Threads 6. CPU-Scheduling 7. Synchronisation und Kommunikation 8. Speicherverwaltung 9. Geräte- und Dateiverwaltung 10. Betriebssystemvirtualisierung
Prof. Dr. Peter Mandl Seite 48