Stoex Defense — IT-Security and Consulting

IT-Sicherheit einfach erklärt.

Eine Einführung in Computer und Betriebssysteme.

Warum stürzt Windows immer ab? Sind Apple Produkte sicherer? Was ist Linux und was hat es mit 3G, 4G, LTE, 5G auf sich? Viele Alltagsfragen lassen sich leicht mit ein bisschen Wissen über die Funktionsweise von Computern, Betriebssystemen und Netzwerken beantworten.

Das ist nichts anderes als Gedichtinterpretationen in der Schule. Wir werden nicht alle Dichter und Autoren und trotzdem profitieren wir von den Sprachfähigkeiten, die wir dabei erwerben.

Begriffe

Von-Neumann-Architektur

John von Neumann hat überlegt, wie man einen elektrischen Computer bauen könnte und hat seine Ideen bis 1949 in verschiedenen Veröffentlichungen beschrieben. Die Von-Neumann-Architektur besteht aus fünf Komponenten:

  1. Steuerwerk
  2. Rechenwerk
  3. Bus-System
  4. Ein- und Ausgabesystem
  5. Speichersystem

Das Steuerwerk koordiniert die Ausführung eines Programms und sorgt dafür, dass dem Rechenwerk alle benötigten Daten bereitgestellt werden. Im Rechenwerk werden dann die Befehle tatsächlich ausgeführt. Das Bus-System ist für die Kommunikation zwischen allen Komponenten zuständig. Zu den Ein- und Ausgabesystemen gehören z.B. Maus, Tastatur, Bildschirm, Drucker, Scanner, Touchscreen, aber auch die Festplatten. Im Speichersystem wird das Programm und alle benötigten Daten abgelegt. Die Festplatte gehört jedoch nicht zum Speichersystem, da die Daten erst von der Festplatte gelesen werden müssen, bevor sie verarbeitet werden können. Das Speichersystem wird auch als Arbeitsspeicher oder RAM bezeichnet.

Das Zusammenspiel der Komponenten wird von dem Von-Neumann-Zyklus beschrieben:

  1. Befehl holen: Zuerst muss der Prozessor wissen welcher Befehl als nächstes bearbeitet werden soll. Dazu meldet er sich bei dem Hauptspeicher mit seinem Programmzähler und bekommt als Antwort den Inhalt der jeweiligen Speicherzelle zurück. Außerdem wird der Programmzähler in Vorbereitung für den nächsten Zyklus um Eins (+1) erhöht.

  2. Befehl decodieren: Die Befehle eines Programms sind immer als Zahlenwert gespeichert, da sie so am wenigsten Platz einnehmen. Bevor jedoch ein Befehl ausgeführt werden kann, muss dieser in die Maschinensprache übersetzt werden. Das könnten dann Befehle wie Addiere, Subtrahiere, Dividiere aber auch Invertiere sein.

  3. Operand holen: Die Operanden sind die Zahlen, auf die die Berechnung angewendet werden soll. Der Prozessor sendet die Speicheradresse an den Hauptspeicher und bekommt als Antwort die Zahl zurück. Wie in Schritt 1 findet die Kommunikation über das Bus-System statt.

  4. Befehlsausführung: Nachdem den Befehl und den Operanden kennen, können wir nun die tatsächliche Berechnung durchführen.

  5. Ergebnis speichern: Das Ergebnis wird entweder zurück in den Hauptspeicher oder in ein Register geschrieben.

Ein wichtiger Bestandteil jedes Prozessors ist das Register. Es kann Zwischenergebnisse speichern und sehr schnell an den Prozessor zurückgeben. Die Register sind viel performanter als der Hauptspeicher, da er direkt in den Prozessor integriert ist.

Dem aufmerksamen Leser ist aufgefallen, dass ja nur ein Operand geholt wird. Braucht ein Befehl zwei Operanden (z.B. die Addition zweier Zahlen), so muss der Zyklus ein zweites Mal durchlaufen werden. Im ersten Durchgang wird die erste Zahl in das Register gelegt, um im zweiten Durchlauf schnell den Zugriff darauf zu haben.

Der Von-Neumann-Zyklus ist damit eine allgemeine und grundsätzliche Beschreibung wie unsere heutigen Computer funktionieren. Die Geschwindigkeiten heutiger Computer wären mit einer starren Umsetzung nicht möglich. Daher werden noch zwei weitere Techniken eingesetzt, die die Ausführung von Programmen beschleunigen.

  1. Befehlssatzerweiterungen: Neben einfachen arithmetischen Berechnungen (Addition, Subtraktion, Division und Multiplikation) beherrschen Computer auch komplexe Befehle, wie Vektorrechnung, AES Verschlüsselung, Videodekodierung etc. Dadurch können viele Berechnungsschritte eingespart werden, was einen enormen Geschwindigkeitsvorteil bedeutet.

  2. Pipelining: Bis jetzt haben wir angenommen, dass jeder Zugriff auf den Hauptspeicher sofort ausgeführt und beantwortet wird. In der Realität ist dem leider nicht so, weswegen der Prozessor immer wieder auf den langsameren Hauptspeicher warten muss. Um deswegen nicht in den Stillstand zu geraden fängt der Prozessor schon die Bearbeitung anderer Befehle an. Um die Arbeit zu unterbrechen werden die benötigten Daten in so genannten Caches abgelegt. Diese sind etwas langsamer als die Register, aber immer noch weit schneller als der Hauptspeicher. So bleibt die CPU ausgelastet.

Zugriffsgeschwindigkeiten

Nicht alle Komponenten eines Computers sind gleich schnell. Nachfolgend sind die bekannten Bestandteile von sehr schnell bis extrem langsam aufgelistet.

  1. Register (1ns)
  2. L1 Cache (2ns)
  3. L2 Cache (5ns)
  4. Hauptspeicher (10ns)
  5. Festplatte (1.000ns)

Mit jedem Schritt nach unten vergrößert sich die Zugriffszeit enorm. Registerzugriffe finden im Bereich von Nanosekunden statt, während das Lesen einer Datei auf einer alten Magnetfestplatte (HDD) mehrere Millisekunden dauern kann.

Betriebssysteme

Die Von-Neumann-Architektur und der zugehörige Zyklus beschreibt abstrakt die Funktionsweise eines Computers, welches gerade ein Programm abarbeitet. Was passiert jedoch, wenn das Programm fertig ist? Oder es auf Benutzereingaben warten muss und in der Zwischenzeit auch noch andere Programme laufen lassen könnte? Und sowieso: Ich kann doch unter Windows im Internet sein, im Hintergrund E-Mails abrufen und Musik hören. Alles gleichzeitig. Die Steuerung von diesen Aufgaben obliegt dem Betriebssystem.

Aufgaben eines Betriebssystems

Was erwarten wir von einem modernen Betriebssystem bzw. Kernel? Wir wollen beliebige Programme ausführen, der Computer soll jederzeit flüssig bedient werden können, wir wollen sicher vor Schadsoftware und anderen Benutzern sein und er sollte nicht abstürzen.

  1. Benutzerschnittstellen zur Verfügung stellen: Das Betriebssystem muss dem Benutzer Zugriff auf seine Ressourcen geben. Dazu werden meist grafische Oberflächen (wie z.B. bei Windows, iOS) bereitgestellt. Das muss aber nicht immer so sein: Linux, wie Microsoft DOS damals, bietet standardmäßig nur eine Textkonsole (Terminal) bereit. Doch auch für Linux stehen verschiedene grafische Oberflächen (GUI, graphical user interface) bereit.

  2. Steuerung der Hardware: Programme dürfen nicht direkt auf die Hardware zugreifen. Das wäre viel zu gefährlich, denn dann dürfte ja jeder alles machen. Der Musikplayer darf nicht wie im Wilden Westen einfach auf die Daten der Bankanwendung zugreifen. Um das zu verhindern müssen alle Programme über Schnittstellen des Betriebssystems auf die Hardware zugreifen. Dabei werden auch Unterschiede zwischen einzelnen Hardware Komponenten (z.B. Prozessoren von Intel und AMD) ausgeglichen, sodass nicht jedes Programm neu entwickelt werden muss. Wir erinnern uns: Die Maschinenbefehle sind plattformabhängig und unterscheiden sich zwischen verschieden Herstellern und sogar Serien.

  3. Kontrolle und Überwachung von Prozessen: Das Betriebssystem verwaltet den Ablauf von allen Prozessen: Programme müssen geladen werden, Prozesse beendet werden.

  4. Verwaltung von Benutzern, Geräten und Ressourcen: Wichtig ist die Verwaltung von Ressourcen. Hauptsächlich sind das Arbeitsspeicher und Rechenzeit (CPU-Zeit). Wie viel darf sich ein Prozess herausnehmen bevor das System instabil wird oder andere Anwendungen abstürzen? Die Zuteilung erfolgt auf Basis von mehreren Regeln, die wir später noch besprechen. Grundsätzlich sind alle Ressourcen begrenzt und müssen daher angemessen verteilt werden. Sofern mehrere Benutzer auf einem System eingerichtet sind muss das Betriebssystem die Prozesse, Dateien bzw. Ressourcen allgemein abschirmen. Dazu kommt noch die Verwaltung von Geräten: Es kann nur ein Prozess zurzeit drucken. Daher braucht das Betriebssystem eine Warteschlange für alle weiteren Aufträge.

  5. Systemsicherheit gewährleisten: Abschließend ist das Betriebssystem der Wächter über die Sicherheit des gesamten Systems. Das Betriebssystem muss den Zugriff auf die Hardware beschränken und überwachen, die Kommunikation zwischen Prozessen steuern und Fehlverhalten von Prozessen stoppen und bösartige Software in die Schranken weisen. In einer idealen Welt würde man jedes noch so schädliche Programm auf einem Computer ohne Sorgen laufen lassen können, da das Betriebssystem Schlimmeres verhindert.

Eine kurze Anmerkung zu Programmen und Prozessen: Ein Programm ist eine Anreihung an Befehlen. Wenn das Programm ausgeführt wird, dann starten ein oder mehrere Prozesse. Prozesse sind laufende Einheiten eines Programms.

Benutzerschnittstellen zur Verfügung stellen
Steuerung der Hardware
Kontrolle und Überwachung von Prozessen
Verwaltung von Benutzern, Geräten und Ressourcen
Systemsicherheit gewährleisten
Wie funktioniert der Wechsel zwischen Programm und Betriebssystem?

Nach dem Von-Neumann-Zyklus kann immer nur ein Befehl zurzeit verarbeitet werden. Wie kann dann das Betriebssystem die Kontrolle über ein laufendes Programm erlangen? Beim Starten des Computers wird das Betriebssystem initialisiert. Es läuft das Programm “Betriebssystem” ab. Irgendwann wollen wir jedoch ein Programm laufen lassen und weisen das Betriebssystem an die Textverarbeitung zu starten. Der Kernel “übergibt” an die Textverarbeitung und der Prozessor führt das Programm aus.

Im Detail passiert folgendes: Das Betriebssystem läuft gerade auf dem Prozessor. Ein neues Programm soll gestartet werden. Daher wird der Inhalt des Programmzählers in dem Register gespeichert, sodass die Ausführung gleich wieder fortgesetzt werden kann. Dann beginnt die Ausführung des neuen Programms.