Praktische Einführung mit Virtualisierung
Stefan Bosse
Universität Koblenz - FB Informatik
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick ::
Was sind Betriebssysteme?
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick ::
Was sind Betriebssysteme?
Was sind Virtuelle Maschinen?
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick ::
Was sind Betriebssysteme?
Was sind Virtuelle Maschinen?
Wie sind Betriebssysteme aufgebaut, wie programmiert man sie, wie analysiert man Fehler?
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Betriebsysteme
Was ist ein Betriebssystem?
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Betriebsysteme
Was ist ein Betriebssystem?
Das Betriebssystem soll den Anwendungsprogrammierer bzw. den Anwender von Details der Rechnerhardware entlasten. Modern strukturierte Betriebssysteme kapseln den Zugriff auf die Betriebsmittel. Das Betriebssystem stellt somit eine virtuelle Maschine über der Hardware bereit.
Das Betriebssystem ist ein Programm mit Besonderheiten die in diesem Kurs untersucht werden. Auch praktisch!
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Betriebsysteme
Ein-/Ausgabe ohne und mit Betriebssystem
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Lernziele
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Literatur
Grundkurs Betriebssysteme
Peter Mandel
Springer Verlag
Betriebssysteme
Eduard Glatz
dpunkt Verlag
Betriebessysteme, kompakt
Christian Baun
Springer Verlag
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Literatur
Operating Systems - Design And Implementation
Andrew S. Tanenbaum
Prentice Hall
Modern Operating Systems
Andrew S. Tanenbaum
Prentice Hall
Distributed Operating Systems
Andrew S. Tanenbaum
Prentice Hall, 1996
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Taxonomie der Betriebssysteme
Klassen:
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Betriebssysteme und Rechnerarchitektur
Betriebssysteme sind eng verknüpft mit Rechnerarchitekturen!
Eingebettetes System
Server
Notebook
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Programmierung von Betriebssystemen
Randbedingungen:
Wir werden ein minimales Betriebssystem (basekernel) in C programmieren. C?
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Programmierung von Betriebssystemen
Die Programmierung, der Test und die Fehlersuche in Betriebssystemen ist wenig komfortabel und methodisch getrieben wie die Informatik es im klassischen Softwareentwurf lehrt und ggfs. praktiziert!
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Programmierung von Betriebssystemen
Die Programmierung, der Test und die Fehlersuche in Betriebssystemen ist wenig komfortabel und methodisch getrieben wie die Informatik es im klassischen Softwareentwurf lehrt und ggfs. praktiziert!
Welcher Debugger (Diagnosewerkzeug zur Fehlersuche) wird am häufigsten in der Praxis bei der Fehlersuche eingesetzt ?
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Programmierung von Betriebssystemen
Die Programmierung, der Test und die Fehlersuche in Betriebssystemen ist wenig komfortabel und methodisch getrieben wie die Informatik es im klassischen Softwareentwurf lehrt und ggfs. praktiziert!
Welcher Debugger (Diagnosewerkzeug zur Fehlersuche) wird am häufigsten in der Praxis bei der Fehlersuche eingesetzt ?
Fehlersuche in Betriebssystemen ist wie Detektivarbeit (Sherlock Holmes, Hercule Poirot)!
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Basekernel
https://github.com/dthain/basekernel
Prof. Douglas Thain (University of Notre Dame) et al.
Statistik der Programmiersprachen:
C | Assembler | Sonstiges |
---|---|---|
96.3% | 3.0% | 0.7% |
Kernel: ≈13000 Zeilen | Kernel: ≈710 Zeilen | - |
Library: ≈7200 Zeilen | - | - |
User: ≈1500 Zeilen | - | - |
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Basekernel
Basekernel ist ein einfacher Betriebssystemkern für Forschung, Lehre und Spaß.
Der Basiskernel ist kein vollständiges Betriebssystem, aber er ist ein Ausgangspunkt für diejenigen, die neuen Betriebssystemcode studieren und entwickeln möchten.
Basekernel kann in einer Intel PC-kompatiblen virtuellen Maschine im geschützten 32-Bit-Modus gestartet werden, mit Unterstützung für VESA-Framebuffer-Grafiken, ATA-Festplatten, optische ATAPI-Geräte, Prozessverwaltung, Speicherschutz, einfache Grafiken und grundlegendes Dateisystem.
Es können einfach neue Programme auf Benutzerebene geschrieben und das System erweitert werden.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Basekernel: Das erste Experiment geht schief
Das Betriebssystem wird automatisch mittels des make Programms erzeugt (Dauer: 2 Sekunden!):
Der erste Versuch das Betriebssystem (baserkernel.iso
) in der vm86 zu starten führt zu der Ausgabe (und 100% CPU Last):
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Basekernel: Das erste Experiment geht schief. Was war passiert?
Wir sehen an der Terminalausgabe dass der Bootloader geladen wurde, dieser das Kernelprogramm geladen hat, und es schließlich gestartet hat.
Dann war Schluss...
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Basekernel: Das erste Experiment geht schief. Was war passiert?
Okay, in den Programmcode des Bootloaders schauen und her mit dem printf Debugger ...
Programmiersprache des Bootloaders: Maschinensprache (Assembler)! OMG
Printf? Gibt es nicht.
Es gibt nur die Möglichkeit mit einer Reihe von Maschinenbefehlen des Mikroprozessors via BIOS Funktionen Textzeichen auf den Bildschirm zu setzen!
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Basekernel: Das erste Experiment geht schief. Was tun?
bios_putstring: # routine to print an entire string mov (%si) , %al cmp $0 , %al jz bios_putstring_done call bios_putchar inc %si jmp bios_putstringbios_putstring_done: retbios_putchar: # routine to print a single char push %ax push %bx mov $14 , %ah mov $1 , %bl int $0x10 pop %bx pop %ax retbootmsg: .asciz "\r\nbootblock: booting kernel...\r\n"**** mov $(bootmsg),%si # print boot message call bios_putstring
Ausschnitt Minimalimplementierung "printf" in Assembler (bootblock.S
)
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Basekernel: Das erste Experiment geht schief. Was tun?
Wir fügen Checkpoint Ausgaben in den Bootloader (bootblock.S
) ein um zu sehen wie weit wir kommen und später im Anfang des Betriebssystemkerns (kernelcore.S
)
checkpoint_msg_a: .asciz "Checkpoint BL.1\r\n"checkpoint_msg_b: .asciz "Checkpoint BL.2\r\n"checkpoint_msg_c: .asciz "Checkpoint BL.3\r\n"loadsector: mov $(checkpoint_msg_a),%si # Checkpoint A call bios_putstring mov $1, %al # load 1 sector mov $0x02, %ah # load command int $0x13 # execute load mov $(checkpoint_msg_b),%si # Checkpoint B call bios_putstring mov $'.', %al # display a dot call bios_putchar # for each sector loaded mov (sectors_left),%ax # how many sectors left? cmp $0xffff, %ax # has it been initialized? jne gotsectors # yes - use the value mov %es:(KERNEL_SIZE_OFFSET),%eax # no - get size of kernel shr $9, %eax # convert into blocks inc %eax # add one for good measurenextsector: inc %cl # advance by one sector mov (disk_sectors),%al # what is the maximum sector? cmp %al, %cl # is this the last sector? jle loadsector # no - load the next sector mov $1,%cl # yes - go to sector zero..gotsectors: dec %ax # remove one block mov %ax,(sectors_left) # store the value cmp $0, %ax # are we done? je loaddone # yes - jump to bottomloaddone: mov $(checkpoint_msg_c),%si # Checkpoint C call bios_putstring
Checkpoint Ausgaben in bootblock.S
Bootloader
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Basekernel: Das erste Experiment geht schief. Was tun?
.code16.text.global _start_start:.org KERNEL_SIZE_OFFSET.global kernel_sizekernel_size: .long _end-_startbios_putstring: # routine to print an entire string***bios_putchar: # routine to print a single char***checkpoint_msg_a: .asciz "Checkpoint KS.1\r\n"realstart: mov $(checkpoint_msg_a),%si # Checkpoint A call bios_putstring***
Checkpoint Ausgaben in kernelcore.S
Kernelstart
BL.1
, BL.2
, BL.3
werden erreicht, KS.1
nicht!Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Basekernel: Das erste Experiment geht schief. Was tun?
basekernel.img
) ist aber rund 1 MB groß, d.h. mindestens 250 Blöcke müssten von dem virtuellen CDROM Laufwerk geladen werden..org KERNEL_SIZE_OFFSET.global kernel_sizekernel_size: .long _end-_start
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Basekernel: Das erste Experiment geht schief. Was tun?
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................000000A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................000000B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................000000C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................000000D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................000000E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................000000F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...............
Hex Editor Dump vom Beginn des Kernelimages. Lauter Nullen!?
Nur Nullen im Image - bis - halt stopp, da war doch etwas mit dem Kernelimage und dessen seltsame virtuelle Größe!
Wir schauen uns nun die Symboltabelle, d.h. die Adresstabelle des Kernels an ...
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Basekernel: Das erste Experiment geht schief. Was tun?
>> objdump -t kernel.elfkernel.elf: file format elf32-i386SYMBOL TABLE:080480f4 l d .note.gnu.property 00000000 .note.gnu.property00010000 l d .text 00000000 .text0001e000 l d .rodata 00000000 .rodata0001f1f0 l d .eh_frame 00000000 .eh_frame00024000 l d .data 00000000 .data00024b80 l d .bss 00000000 .bss00000000 l d .comment 00000000 .comment
Auszug von objdump -t kernel.elf
(Symbole und ihre Adressen)
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Basekernel: Das erste Experiment geht schief. Was tun?
>> objdump -t kernel.elfkernel.elf: file format elf32-i386SYMBOL TABLE:080480f4 l d .note.gnu.property 00000000 .note.gnu.property00010000 l d .text 00000000 .text0001e000 l d .rodata 00000000 .rodata0001f1f0 l d .eh_frame 00000000 .eh_frame00024000 l d .data 00000000 .data00024b80 l d .bss 00000000 .bss00000000 l d .comment 00000000 .comment
Auszug von objdump -t kernel.elf
(Symbole und ihre Adressen)
.note.gnu.property
wurde mit in das Image übernommen, hatte aber unabänderlich eine völlig andere Adresse (0x8000000) als die Kernelsymbole (0x10000). Das führte zu einem großen "Speicherloch" im Image und einem völlig falschen Aufbau mit Nullen gefüllt!objcopy -R .note.gnu.property
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Programmiersprache C
Warum C?
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Programmiersprache C
┌―――――――――――――┐ 80000 ┌――――――――――――――――――――――▶│┌―――――┐ │ 79010 │ ││ var │ │ &var=79010 ┌―┴┐ │└―――――┘ │ ┌――▶│25│ 30 35 │ │ │ └――┘ ▲ ▲ │ Heap │ │ │ │ ├――――――――┬――――┤ 50000 │ │ └―――――――――┐ │ ▲ │ │ │ └――――――――――┐ │ │ │ ▼ │ │ │ │ ├―┴―――――――――――┤ 40000 └―― int var=25; │ │ │ Stack │ int *ptr=&var; │ │ ├―――――――――――――┤ 30000 *ptr=30; ――┘ │ │ Data Init. │ int **pptr=&ptr; │ ├―――――――――――――┤ 20000 **pptr=35; ―――┘ │ Data Noinit│ ├―――――――――――――┤ 10000 │ Text │ └―――――――――――――┘ 0
Speicherlayout in C / Pointervariablen
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Programmiersprache C
C History
UNIX History
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Programmiersprache C: C2JS
┌――――――――┐ ┌―――――――――――┐ │ │ │ │ ┌――――――――┐ │ C │ │ C-Analyzer│ ┌―――――――――┐ │C Source├――――▶│ Parser ├――▶│ JS- ├――▶│ JS Code │ └――――――――┘ │ │ │ Generator │ └――――┬――――┘ │ │ │ │ │ └――――――――┘ └―――――――――――┘ ▼ ┌―――┐ ┌―――――――――――┐ Heap │DS │ │┌―――――――――┐│ Stack │ ├――┼│ JS Exec ││ malloc │ │ │└―――――――――┘│ │ free │ │ └―――――――――――┘ │ │ │ │ Sandbox Env. │ │ JavaScript └―――┘ │ └――――――――――――――――――――――――――――――――――――――――――┘
C2JS Architektur
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Programmiersprache C: Live Programming mit C2JS
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Programmiersprache C: Live Programming mit C2JS
──────────────────────────────────────────────────────────────────────────────────────#include "clib.h" int x=1; int main () { printf("Hello World %d\n",x); } ──────────────────────────────────────────────────────────────────────────────────────Object.assign(CS,{"-1":"free","-2":"malloc","-3":"memcpy","-4":"printf","-5":"main"});Object.assign(CSI,{"free":-1,"malloc":-2,"memcpy":-3,"printf":-4,"main":-5}); var x=x||__heap_allocate(1,4,"int"); DS.writeInt32(1,x); function main() { var __sp=__stack_pointer(); printf("Hello World %d\n",DS.readInt32(x)); __stack_pointer(__sp); }; main(argc,argv) ──────────────────────────────────────────────────────────────────────────────────────
(Oben) C Code (Unten) Transpillierte JS Code
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Betriebssysteme - Eine Einführung
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Betriebssysteme - Eine Einführung
Zentrale Ressourcen | Periphere Ressourcen | |
---|---|---|
Aktive Ressourcen | Prozessor(en) | Kommunikationseinheiten: 1. Endgeräte (Tastaturen, Drucker, Anzeigen, Zeigegeräte etc.) 2. Netzwerk (entfernt, lokal) etc. |
Passive Ressourcen | Hauptspeicher | Speichereinheiten: 1. Festkörper SDD 2. Platten HDD 3. Bänder Tape 4. CD-ROM/DVD etc. |
Ressourcenklassen
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Betriebssysteme - Eine Einführung
Es gibt nicht das Betriebssystem schlechthin, sondern nur eine den Forderungen der Anwenderprogramme entsprechende Unterstützung, die von der benutzerdefinierten Konfiguration abhängig ist und sich im Laufe der Zeit stark gewandelt hat. Gehörte früher nur die Prozessor-, Speicher- und Ein-/Ausgabeverwaltung zum Betriebssystem, so werden heute auch eine grafische Benutzeroberfläche mit verschiedenen Schriftarten und -größen (Fonts) sowie Netzwerkfunktionen verlangt.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Betriebssysteme - Das Schichtenmodell (1)
978-3-96088-839-0
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Betriebssysteme - Programme
Softwaregliederung
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Betriebssysteme - Programme
Die eigentlichen Steuerprogramme sind für folgende Funktionen zuständig:
Auffallend bei dieser Definition ist die Einbeziehung von Übersetzern (Compiler, Binder), Testhilfen und Dienstprogrammen.
Für klassische Betriebssysteme (z.B. Unix und GNU-Tools) trifft dies vollumfänglich zu, während moderne Betriebssysteme oft die Bereitstellung von Übersetzungstools irgendwelchen Drittherstellern überlassen bzw. diese als separate Applikation ausliefern (z.B. Windows und Visual Studio).
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Einordnung im Computersystem
bsdp In einem Rechner stellt das Betriebssystem eine Softwareschicht dar, die zwischen den Benutzerapplikationen einerseits und der Rechnerhardware andererseits liegt.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Einordnung im Computersystem
Die Betriebssystemtheorie beruht damit auf den Prinzipien der Computertechnik. Computertechnik befasst sich mit:
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Einordnung im Computersystem
Wir unterscheiden klassisch:
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Einordnung im Computersystem
Weitere Unterteilung (modern) von Betriebssystemen nach unterstützter Rechnerstruktur:
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Betriebssystemmodell
Es gibt zwei Arten von Betriebssystemmodellen:
bsdp Black- und Whitebox-Betrachtung (Beispiel: Unix)
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Entwurf von Betriebssystemen
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Betriebsmodus
Betriebssystemeprogramme sind wie Benutzeprogramme Programme aber mit verschiedenen Rechten und Rollen.
Diese Rechte und Rollen benötigen Hardwareunterstützung
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Betriebsmodus und Schutz
Minimales Zweiebenen Modussystem:
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Betriebsmodus und Schutz
Benutzermodus | Kernmodus | |
---|---|---|
Ausführbare Maschinenbefehle | Begrenzte Auswahl | Alle |
Hardwarezugriff | Nein bzw. nur mithilfe des Betriebssystems | Ja, Vollzugriff |
Zugriff auf Systemcode bzw. Daten | Keiner bzw. nur lesend | Exklusiv |
Vergleich zwischen Benutzer- und Kernmodus
Im Idealfall werden Schutzmechanismen auch für die Abschottung verschiedener Systemteile untereinander eingesetzt. Die Grenze des Sinnvollen ist allerdings darin zu sehen, dass eine teilweise lahmgelegte Systemsoftware aus Sicht des Anwenders oft nicht besser ist als ein Totalabsturz.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Monolithische Systeme
Die Struktur dieser Systeme besteht darin, dass sie keine oder nur eine unklare Struktur haben.
bsdp Beispiel für eine monolithische Betriebssystemstruktur
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Schichtsysteme
Bei dieser Strukturierungsform sind die Betriebssystemfunktionen in viele Teilfunktionen gegliedert, die hierarchisch auf mehrere Schichten verteilt sind.
bsdp Beispiel einer geschichteten Struktur
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Mikrokernelsysteme
Nur die allerzentralsten Funktionen sind in einem (kleinen) Kernteil zusammengefasst, alle übrigen Funktionen sind als Serverdienste separat realisiert. Nachrichtenbasierte Kommunikation!
bsdp Mikrokern nach dem Client/Server-Prinzip
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Mikrokernelsysteme
Der Mikrokern enthält lediglich die vier Basisdienste:
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Multiprozessorsysteme
Stefan Bosse - Grundlagen der Betriebssysteme - Modul A Einführung und Überblick :: Verteilte Betriebssysteme