Grundlagen der Betriebssysteme

Praktische Einführung mit Virtualisierung

Stefan Bosse

Universität Koblenz - FB Informatik

1 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen ::

Rechner- und Prozessorgrundlagen

Wie funktioniert ein Rechner?

2 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen ::

Rechner- und Prozessorgrundlagen

Wie funktioniert ein Rechner?

Wie werden Programme von einem Rechner verarbeitet?

3 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Grundmodell eines Rechners

Grundmodell eines Rechners

Programm
Eine Sequenz von Maschinenbefehlen (= Prozessorinstruktionen) wird zusammen mit ihrer Datenhaltung als Programm bezeichnet
Programmausführung
Entsprechend die Ausführung durch den Prozessor als Programmausführung.

Die meisten heute gebauten Computersysteme beruhen auf der Aufbaustruktur des Von-Neumann-Rechners, die John von Neumann 1946 aufgestellt hat. Seltener kommt die alternative Struktur des Harvard-Rechners zum Zug, benannt nach der Struktur des Mark-I-Rechners an der Harvard University (1939-44).

4 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Grundmodell eines Rechners

Von-Neumann Rechner

Der Von-Neumann-Rechner besteht aus vier Funktionseinheiten:

bsdp Funktionsblöcke des Von-Neumann-Rechners

5 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Grundmodell eines Rechners

Leitwerk (Control Unit, CU)
Programme werden maschinenintern als Zahlen, auch Maschinenbefehle genannt, gespeichert. Die Maschinenbefehle legen die vom Prozessor auszuführenden Operationen fest. Das Leitwerk holt die Maschinenbefehle nacheinander aus dem Speicher, interpretiert sie und setzt sie in die zugehörigen Steueralgorithmen um. Das Leitwerk übernimmt damit als Befehlsprozessor die Steuerung der Instruktionsausführung. Unter Steueralgorithmen verstehen wir mögliche Prozessoroperationen, wie z.B. eine Addition, logische Oder-Verknüpfung oder Daten kopieren.
Rechenwerk (Processing Unit, PU)
Eingabedaten können neben den Maschinenbefehlen Bestandteile eines Programms sein (sie liegen dann im Speicher vor) oder werden während des Programmablaufs über die Funktionseinheit Ein-/Ausgabe von der Peripherie hereingeholt. Das Rechenwerk holt die Daten aus dem Speicher bzw. von der Eingabe, transformiert diese Daten mittels unterschiedlicher Steueralgorithmen und legt sie im Speicher ab bzw. übergibt sie der Ausgabe. Als eigentlicher Datenprozessor realisiert es die logischen und arithmetischen Operationen.
Speicher (Memory)
Er enthält die Maschinenbefehle und die zu verarbeitenden Daten. Eine Folge von logisch zusammengehörenden Maschinenbefehlen bezeichnen wir als Programm. Sowohl Befehle als auch Daten befinden sich in einem gemeinsamen Adressraum. Der Speicher dient somit der kombinierten Ablage von Programmen und Daten.
6 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Grundmodell eines Rechners

Ein-/Ausgabe (Input/Output, I/O)
Sie verbindet die Peripheriegeräte (z.B. Tastatur, Monitor, Drucker) mit dem Rechenwerk, stellt also eine oder mehrere Schnittstellen zur Umwelt dar. Mittels passender Maschinenbefehle werden über die Ein-/Ausgabe Daten von der Peripherie entgegengenommen oder dieser übergeben. Ursprünglich wurden das Eingabewerk und das Ausgabewerk als zwei getrennte Funktionsblöcke betrachtet. Heute werden sie zur Ein-/Ausgabe zusammengefasst.
Bussystem
Die Schaltzentrale um alle vier Werke miteinander zu verbinden. Gleichzeitig der Flaschenhals im gesamten Rechner (neben dem Speicher als zentrale Ressource für Programm und Daten)

bsdp Betriebssystem und Von-Neumann-Rechner

7 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Prozessoraufbau

Prozessoraufbau

  • Jede CPU-Familie besitzt einen spezifischen Instruktionssatz und Registeraufbau, mit dem sie sich von anderen Prozessorfamilien unterscheidet.
    • Deswegen muss ein Programm stets für die richtige CPU übersetzt sein, damit die Maschinenbefehle korrekt interpretiert werden.
    • Innerhalb einer sogenannten CPU-Familie kann jedoch der gleiche Code benutzt werden.
  • Ein Prozessor besteht grob gesehen aus den Teilen Leitwerk, Rechenwerk, Register, Adress- und Bussteuerung

bsdp Schematischer Prozessoraufbau

8 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Register

Register

  • Register sind Speicherzellen, aber im Mikroprozessor integriert, und teils mit spezieller Bedeutung, wie z.B.:
    • PC: Program Counter (Code Adresszeiger)
    • SP: Stack Pointer (Daten Adresszeiger)
  • Die Registersätze verschiedener CPu Familien können sich erheblich unterscheiden
  • Man unterscheidet grob drei Klassen CPU Architekturen, mit weitreichenden Folgen für Betriebssysteme und Programme (Erstellung):
    • Complex Instrucion Set Computer (CISC): Wenige Register, Operationen sind hauptspeicherzentriert, variables Instruktionsformat und Anzahl von Operanden ⇒ Intel x86 usw.
    • Reduced Instruction Set Computer (RISC): Viele Register, Operationen sind registerzentriert, teils fixes Instruktionsformat, wenige Operanden ⇒ ARM Cortex, Sun UltraSparc usw.
    • Stack Processors: Wenige Register, Operationen sind stackzentriert, 0-Operand Instruktionen ⇒ Green Array F18A (Dual stack Forth architecture), Virtual Machines!
9 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Register

Register

Beispiele von CPU-Registern

10 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Grundlagen der Programmausführung

Grundlagen der Programmausführung

Rechnereinteilung nach Adressanzahl: gezählt wird die Anzahl Operanden eines dyadischen Operators (z.B. einer Addition)

11 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Grundlagen des Adressraums

Grundlagen des Adressraums

Der Zugriff auf die Befehle eines Programms erfolgt ebenso wie auf alle im Speicher abgelegten Operanden mittels Speicheradressen. Die Organisation des Adressraums stellt damit eine wichtige Eigenschaft und allenfalls auch Limitierung einer bestimmten Rechnerplattform sowie des Betriebssystems dar.

Ein Adressraum Σ ist gekennzeichnet durch:

  1. Gesamtgröße in Bits (oder Bytes)
  2. Anzahl N=|Σ| von Speicherzellen
  3. Anzahl der möglichen Adressen (u.U. ≠ Bytes!)
  4. Anzahl der Bits pro Speicherzelle W, d.h. die Wortbreite
12 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Grundlagen des Adressraums

Grundlagen des Adressraums

  • Adressen sind numerische (ganzzahlige) Werte und referenzieren Speicherzellen

  • I.A. wird die erste Adresse mit 0, die letzte als N-1 bezeichnet.

  • Achtung: Die Adresse kann sich entweder auf die Speicherzelle mit der Wortbreite W oder die Elementarzelle mit der Breite B Bits (i.A. 1 Byte) beziehen!

bsdp Grundprinzip des Adressraums, hier Byteadressierung

13 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Rechner- und Prozessorgrundlagen :: Adressraumtypen

Adressraumtypen

  • Der (Haupt-) Speicher M ist zunächst passiv und enthält Daten und Programmcode
  • Aber neben dem Speicher müssen auch Ein- und Ausgabegeräte P "adressiert" (selektiert) und mit denen kommuniziert werden...
  • Es gibt grob zwei Adressraumtypen bezüglich Speicher und Peripheriegeräten, die auch für das Betriebssystem sehr relevant sind:
    • Gemeinsamer Adressraum Σ=⟨M,P⟩
    • Getrennte Adressräume ΣM=⟨M⟩, ΣP=⟨P⟩

Klassischer und erweiterter Von-Neumann-Rechner

14 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumtypen

Speicher und Speicherverwaltung

Wie ist das Speichermodell eines Programs und Prozesses organisiert?

15 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumtypen

Speicher und Speicherverwaltung

Wie ist das Speichermodell eines Programs und Prozesses organisiert?

Wie ist das Speichermodell eines Betriebssystems organisiert?

16 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumtypen

Speicher und Speicherverwaltung

Wie ist das Speichermodell eines Programs und Prozesses organisiert?

Wie ist das Speichermodell eines Betriebssystems organisiert?

Wie findet Speicherverwaltung statt?

17 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Bytereihenfolge (byte ordering)

Bytereihenfolge (byte ordering)

Ein ganz einfacher Prozessor könnte nur mit Datenwerten von 8 Bit Größe arbeiten, d.h., er würde über eine Speicheradresse stets nur ein einzelnes Byte lesen oder schreiben. Heutige Universalprozessoren unterstützen jedoch verschiedene Operandengrößen, die auch mehrere Byte umfassen können.

Varianten der Bytereihenfolge bei Mehrbyte-Datenwerten (Beispiel für 4-Byte-Wert)

18 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Ausrichtungsregeln im Adressraum

Ausrichtungsregeln im Adressraum

Die Ausrichtungsregeln (alignment rules) legen fest, auf welchen Adressen Variablen und Instruktionen liegen müssen. Sie sind maßgebend für die Programmübersetzung (Compiler, Assembler, Binder). Ihr Zweck liegt in der Erreichung optimaler Ausführungsgeschwindigkeiten auf dem benutzten Rechnersystem. Da sie von der Hardware abhängen, können sie entsprechend der benutzten Rechnerplattform variieren. Ausrichtungsregeln können sowohl für Code als auch Daten existieren.

bsdp Fehlausrichtung im Adressraum und ihre Folgen (Beispiel für einen 32-Bit-Datenbus und einen Zugriff auf einen Datenwert von 32 Bit Größe)

19 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Ausrichtungsregeln im Adressraum

Ausrichtungsregeln im Adressraum

  • Bedeutung für Instruktionscode: Abhängig von der Prozessorhardware gelten andere Ausrichtungsregeln, z.B.:
    • Instruktionen müssen immer auf geradzahligen Adressen liegen.
  • Bedeutung für Daten: Die Datenbusbreite bestimmt die Ausrichtungsregeln für eine optimale Zugriffsgeschwindigkeit.
    • Z.B. ist der Datenbus 32 Bit breit. Damit ist eine optimale Ausrichtung für 4-Byte-Werte eine sogenannte Langwortgrenze, d.h. eine ohne Rest durch vier teilbare Adresse.
    • Im vorherigen Beispiel ist die Notwendigkeit von zwei Zugriffszyklen auf dem Datenbus gezeigt, wenn die Ausrichtungsregel nicht eingehalten wird (misalignment).
  • Beim C-Strukturdatentyp (struct) bzw. dem C++-Klassendatentyp (class) gelten die Ausrichtungsregeln jeweils separat für die einzelnen Teilkomponenten. Neben dem Einfluss auf die Zugriffsgeschwindigkeit spielt dies wiederum sowohl für die Kompatibilität beim Datenaustausch wie auch für den effektiv belegten Platz im Adressraum eine Rolle.
20 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Ausrichtungsregeln im Adressraum

Ausrichtungsregeln im Adressraum

Einfluss der Ausrichtung auf die resultierende Adressraumplatzierung (Beispiel)

21 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumbelegung durch Programme

Adressraumbelegung durch Programme

  • Die Belegung des Adressraums durch ein Programm wird einerseits durch die Übersetzungswerkzeuge, andererseits durch das Betriebssystem festgelegt.

  • Im Grundsatz können etwa fünf verschiedene Bereiche unterschieden werden:

  1. Code und Konstanten: Die zugehörigen Speicherinhalte werden aus der ausführbaren Datei in den Hauptspeicher geladen. Dieser Adressbereich ändert seine Größe während der Programmausführung nicht.

  2. Initialisierte Daten: Ein passender Bereich des Adressraums wird reserviert und anschließend werden die Initialwerte der Variablen aus der ausführbaren Datei dorthin geladen. Dieser Adressbereich ändert seine Größe während der Programmausführung nicht.

  3. Nicht initialisierte Daten: Ein passender Speicherbereich wird reserviert und eventuell gelöscht (d.h. mit 0 geladen). Dieser Adressbereich ändert seine Größe während der Programmausführung nicht.

22 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumbelegung durch Programme

Adressraumbelegung durch Programme

  1. Heap und Stack: Es wird ein gemeinsamer Bereich im Adressraum derart reserviert, dass die zwei Bereiche möglichst weit voneinander entfernt sind. Im Betrieb können sowohl Heap als auch Stack wachsen und schrumpfen.

Das Wachstum ist aber nur ungefährlich, solange sich die Heap- und Stack-Inhalte nicht überschneiden. Eine derartige Überschneidungssituation würde zu einem Fehler führen. Die Kunst liegt darin, diese Bereiche ausreichend groß zu wählen und eine mögliche Fehlsituation erkennen zu können. Ein Betriebssystem und/oder ein Laufzeitsystem einer Programmiersprache können hier allenfalls Hilfe anbieten, um Fehlsituationen zu erkennen.

  • Weitere Lösung des Kollisonsproblem: Getrennte Segmente für Heap und Stackspeicher eines Programms.
23 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumbelegung durch Programme

Adressraumbelegung durch Programme

Alternative Layouts des Adressraums eines Programms (oder Prozesses als Programm in Ausführung)

24 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumnutzung durch C-Programme

Adressraumnutzung durch C-Programme

Für die Programmierung ist es hilfreich, die Platzierungsregeln für Variablen in der Programmiersprache C zu kennen. Nachfolgend sind sie kurz aufgeführt:

Global (d.h. außerhalb einer Funktion) deklarierte Variablen
Ohne Initialisierung werden sie im Bereich nicht initialisierte Daten platziert. Mit einer Initialisierung jedoch im Bereich initialisierte Daten. Diese unterschiedliche Behandlung wird deshalb gemacht, weil die Anfangswerte für initialisierte Daten sich aus der ausführbaren Datei laden lassen. Das Betriebssystem kann so diese zwei Fälle klar voneinander unterscheiden.
Innerhalb einer Funktion deklarierte Variablen
Ohne Angabe der Speicherklasse (implizit gilt auto) oder mit Angabe von auto: Es erfolgt eine Platzierung auf dem Stapel. Mit Angabe der Speicherklasse static: Platzierung wie global deklarierte Variablen.
25 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumnutzung durch C-Programme

Adressraumnutzung durch C-Programme

Konstanten (const)
Platzierung im Bereich Code, Konstanten. Sowohl Code als auch Konstanten sind funktional gesehen nur lesbare Speicherinhalte. Da sie separat ausgezeichnet werden, kann das Betriebssystem die so belegten Speicherbereiche mit einem Schreibschutz belegen.
Dynamisch allozierte Daten
Platzierung auf der Halde (Heap). Reservation mittels der Bibliotheksfunktionen malloc() oder calloc(), Freigabe mittels der Bibliotheksfunktion free(). In C++ leisten die Operatoren new und delete Vergleichbares.
Aufrufparameter von Funktionen
Die Parameter stehen auf dem Stapel (Stack) bereit oder werden über allgemeine Prozessorregister übergeben (compilerabhängig konfigurierbar). Zu beachten ist, dass bei der Übergabe von Zeigern die Daten selbst anderswo liegen, d.h. nicht auf dem Stapel!
26 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumnutzung durch C-Programme

Adressraumnutzung durch C-Programme

C2JS

+

27 / 55

Stefan Bosse - Grundlagen der Betriebssysteme - Modul S Speicher und Speicherverwaltung :: Adressraumnutzung durch C-Programme

Adressraumnutzung durch C-Programme

int x=0;
int foo(int x) {
int t=x;
return t+1;
}
int main() {
int y;
int *yp;
y=foo(x);
yp=(int*)malloc(sizeof(int));
*yp=y;
}

Beispiel eines C Programms