3.1.10 Kernel-Mode, User-Mode und Systemaufrufe

Solange auf einem Rechner nur ein einzelner Prozess im Hauptspeicher gehalten wurde und auf dessen CPU ablief, war alles noch ganz einfach: Ein Betriebssystem wurde nicht benötigt und über Sicherheit musste man sich keine Gedanken machen.

Sobald aber mehrere Prozesse quasi-parallel auf einem System ablaufen, wird es komplexer:

  • Jeder einzelne Prozess besitzt eigene Daten, und es muss dafür gesorgt werden, dass nur der berechtigte Prozess Zugriff auf diese Daten hat. Für alle anderen Prozesse muss sichergestellt sein, dass sie keinen unberechtigten Zugriff auf fremde Daten besitzen.
  • Mehrere Prozesse müssen sich auch in fairer Weise auf der CPU abwechseln, damit alle ihre Aufgabe erfüllen können. Dabei muss es eine zentrale Stelle geben, die den fairen Wechsel durchsetzt.

Dies sind nur zwei Beispiele, die letztlich zu der Entwicklung von Betriebssystemen geführt haben. Damit ein Betriebssystem aber diese (und weitere) Aufgaben erfüllen kann, benötigt es auf einem Rechnersystem mehr Privilegien als jeder normale Prozess (als also jedes Anwendungsprogramm).

Aus diesem Grund werden bei der Abarbeitung von Befehlen auf der CPU zwei Modi unterschieden:

  1. Kernel-Mode
  2. User-Mode


Kernel-Mode

Arbeitet die CPU im Kernel-Mode, so ist jeder beliebige Befehl zur Ausführung zugelassen. Es kann auf sämtliche Speicherbereiche für Daten- und Programmtext, sowie auf alle Betriebsmittel zugegriffen werden. Hier ist alles erlaubt, es bestehen die höchsten Privilegien. (Mandl 2013 nennt diesen Modus deshalb auch den privilegierten Modus.)

Durch ein Steuer- oder Kontrollregister auf der CPU wird der Kernel-Mode angezeigt.

Das Betriebssystem arbeitet üblicherweise im Kernel-Mode und hat somit alle Möglichkeiten, seine definierten Aufgaben zu erfüllen.


User-Mode

Arbeitet die CPU im User-Mode, so ist nur ein eingeschränkter Befehlssatz zur Ausführung zugelassen. Es sind also nicht alle Befehle erlaubt, ebenso kann nicht auf alle Speicherbereiche und auch nicht auf alle Betriebsmittel zugegriffen werden.

Durch ein Steuer- oder Kontrollregister auf der CPU wird der User-Mode angezeigt.

Anwendungsprogramme arbeiten üblicherweise im User-Mode. Diese haben damit nur sehr eingeschränkte Möglichkeiten, das soll auch so sein.


Übergang vom User-Mode in den Kernel-Mode

Durch die Unterteilung in User-Mode und Kernel-Mode muss klar definiert sein, wie ein Übergang von dem einen in den anderen Modus stattfinden kann.

Ein Übergang vom höher privilegierten Kernel-Mode in den User-Mode ist unproblematisch, da hierbei die Rechte eingeschränkt werden, und somit keine Sicherheitsbedenken bestehen. Das Betriebssystem veranlasst diesen Übergang, wenn es dem Prozess eines Anwendungsprogramms die CPU zuteilt.

Anders verhält es sich beim Übergang vom User-Mode in den Kernel-Mode. Der Prozess eines Anwendungsprogramms darf nicht über die umfassenden Rechte des Kernel-Modes verfügen. Er kann sie deshalb nur indirekt bekommen, indem er einen sogenannten Systemaufruf ausführt.


Definition: Systemaufruf

Definition

Unter einem Systemaufruf (oder: Systemcall, Syscall) versteht man den von einem im User-Mode ablaufenden Prozess getätigten Aufruf einer vom Betriebssystem zur Verfügung gestellten Funktion, welche nur im Kernel-Mode ausgeführt werden kann.

Durch den Systemaufruf gibt der im User-Mode ablaufende Prozess die Kontrolle zurück an das Betriebssystem, welches die gewünschte Funktion (nach einem Umschalten in den Kernel-Mode) stellvertretend ausführt.

Das Betriebssystem hat damit die Möglichkeit, durch vorherige Sicherheitsüberprüfungen festzustellen, ob der aufrufende Prozess zur Ausführung der gewünschten Funktion überhaupt berechtigt ist, und ob auch sonst keine anderen Gegebenheiten gegen eine Ausführung sprechen.

Ist die betreffende Funktion ausgeführt (oder wurde sie aufgrund der Überprüfungen verweigert), so wird zur Beendigung des Systemaufrufs wieder in den User-Mode zurückgeschaltet, und das Betriebssystem gibt die Kontrolle zurück an den aufrufenden Prozess, der i.d.R. ein Ergebnis seines Systemaufrufs empfängt und in der Folge auf das Resultat reagieren kann.


Beispiel

Beispiel

Ein Anwendungsprogramm möchte auf eine Datei zugreifen.

Der im User-Mode ablaufende Prozess eines Anwendungsprogramms möchte auf eine Datei zugreifen. Diese E/A-Handlung ist jedoch nur im Kernel-Mode zugelassen. Das Betriebssystem stellt dem Anwendungsprogramm deshalb eine Reihe von Systemaufrufen zur Verfügung, welche Dateizugriffe ermöglichen, z.B.:

  • open
  • read
  • write
  • close

Wird jetzt ein Systemaufruf getätigt, so entspricht dies der Auslösung eines (Software-) Interrupts. Der (im User-Mode) laufende Prozess wird angehalten und der weitere Ablauf ist:

  • die zugehörige Interrupt-Service-Routine wird ausgeführt (dadurch wird Betriebssystem-Code ausgeführt),
  • es wird in den Kernel-Mode geschaltet,
  • notwendige Überprüfungen werden durchgeführt (z.B. dürfen nicht quasi-gleichzeitig mehrere Prozesse in eine Datei schreiben),
  • der Dateizugriff wird entweder erlaubt und durchgeführt oder verweigert,
  • es wird in den User-Mode zurückgeschaltet,
  • der zuvor angehaltene Prozess wird wieder gestartet,
  • dabei wird ihm ein Rückgabewert mit dem Ergebnis des Systemaufrufs zur Verfügung gestellt.


Systemaufruf durch Anwendungsprogrammierer

Der folgende JAVA-Quelltext verdeutlicht, wie Systemaufrufe durch einen Anwendungsprogrammierer getätigt werden:

Code

import java.io.FileWriter;
import java.io.IOException;

public class Beispiel_Systemaufrufe {

public static void main(String[] args) {
    FileWriter fw;

    try {

            // Hier folgen drei Systemaufrufe:

            fw = new FileWriter("hallo.txt");

            fw.write("Hallo Systemaufruf!");

            fw.close();

    } catch (IOException e) {
        System.out.println(
            "Es ist ein Fehler aufgetreten: \r\n"
            + e.toString()
        );
    }
}

}

Innerhalb des try-Blocks der try-catch-Anweisung

  • wird eine Datei zum Schreiben geöffnet,
  • wird der Text Hallo Systemaufruf! in die geöffnete Datei geschrieben,
  • wird die Datei wieder geschlossen.

In jeder dieser drei Zeilen findet ein Systemaufruf statt. Es wird dabei jeweils

  • eine von der Java-Laufzeitumgebung bereitgestellte Methode aufgerufen,
  • diese Methode ruft intern eine vom Betriebssystem bereitgestellte Funktion auf,
  • diese Funktion tätigt den betreffenden Systemaufruf,
  • und liefert ggf. einen Rückgabewert bzw. im Fehlerfall eine IOException zurück.


Wichtig

Der Anwendungsprogrammierer muss über Systemaufrufe also gar nichts Näheres wissen. Er nutzt in seinem Quelltext lediglich bereitgestellte Methoden, alles weitere geschieht im Hintergrund.


Aufgabe 1

Aufgabe

Recherchiere im Internet und finde eine Liste mit Systemaufrufen für ein beliebiges Betriebssystem.


Aufgabe 2

Aufgabe

Die folgende Abbildung ist ja bereits aus dem Kapitel Zwischen Benutzer und Hardware bekannt.

  • Welcher Pfeil in der Abbildung symbolisiert einen Systemaufruf?
  • Und wofür steht der Pfeil in Gegenrichtung auf derselben Ebene?

Zbuh01.JPG



Diese Seite steht unter der Creative Commons Namensnennung 3.0 Unported Lizenz http://i.creativecommons.org/l/by/3.0/80x15.png