2.2. Abarbeitungskontext und Unterbrechungsmodell

Abbildung 2-8. Unterbrechungsmodell im Linux-Kernel

Programmcode kann in verschiedenen Umgebungen ablaufen. Die Umgebung – man spricht auch vom Kontext – spezifiziert, welche Dienste und welche Ressourcen einem Codefragment zur Verfügung stehen. Darüber hinaus definiert der Kontext, ob ein Codefragment unterbrechbar ist oder nicht. Diese Kenntnis wiederum ist für den Kernelentwickler unabdingbar, wenn es darum geht zu entscheiden, ob und wie ein kritischer Abschnitt geschützt werden muss.

Ein kritischer Abschnitt bezeichnet ein Codestück, während dessen Abarbeitung ein Zugriff auf mehrfach genutzte Betriebsmittel, zumeist Daten, stattfindet. Wenn beispielsweise die Abarbeitung einer Funktion per Interrupt unterbrochen wird, arbeitet die zugehörige ISR parallel zur Funktion. Sobald beide dieselbe Variable verwenden, liegt bereits ein kritischer Abschnitt vor. Bleiben kritische Abschnitte ungeschützt, kommt es in der Folge häufig zu Instabilitäten des Systems.

Die verschiedenen Umgebungen, in denen Code ablaufen kann, lassen sich bei Linux gemäß einem Vier-Ebenen-Modell klassifizieren (siehe Abbildung Unterbrechungsmodell im Linux-Kernel):

  1. einer User- beziehungsweise Applikations-Ebene,

  2. einer Kernel-Ebene,

  3. einer Softirq-Ebene und

  4. einer ISR-Ebene.

Applikations-Ebene. Code normaler Rechenprozesse, also Code von Tasks und Threads, wird im so genannten User-Kontext abgearbeitet. Ihm stehen die Dienste des Betriebssystems zur Verfügung, wie sie im Systemcall-Interface spezifiziert sind. Code dieser Ebene ist jederzeit unterbrechbar. Die Unterbrechungen finden aufgrund von Interrupts statt, sei es durch einen Hardware-Interrupt oder einen (selbst ausgelösten) Software-Interrupt.

Kernel-Ebene. Nach einem Software-Interrupt wird Code auf der Kernel-Ebene abgearbeitet. Diesem Code stehen sämtliche Funktionalitäten des Betriebssystemkerns zur Verfügung – auch die Funktionalität, das Verarbeiten des Codes für einige Zeit anzuhalten (schlafen zu legen) oder Daten zwischen den Speicherbereichen der Applikationen und des Kernels zu übertragen. Applikationsgetriggerte Funktionen eines Gerätetreibers, Systemcalls, Kernel-Threads und damit auch Workqueues werden in dieser Prozess-Kontext genannten Umgebung abgearbeitet.

Code im Prozess-Kontext wird nur durch einen Hardware-Interrupt unterbrochen. Die zugehörigen Hardware-ISRs können dafür sorgen, dass – bevor das Codefragment zu Ende bearbeitet wird – zwischendurch anderer Code im Prozess-Kontext abgearbeitet wird.

Darüber hinaus kann jede Funktion der Kernelebene auf einer Mehrprozessormaschine mehrfach parallel abgearbeitet werden.

Softirq-Ebene. Codestücke der Softirq-Ebene sind allein durch Hardware-Interrupts unterbrechbar. Da der Code hier im Interrupt-Kontext abläuft, stehen dem Code nicht alle Dienste des Betriebssystemkerns zur Verfügung. Funktionen in diesem Kontext können sich nicht schlafen legen. Sie dürfen auch keine anderen Funktionen wie beispielsweise kmalloc aufrufen, die ebenfalls Code schlafen legen könnten. Der Zugriff auf Speicherbereiche der Applikationen ist ebenfalls tabu. Routinen, die auf dieser Ebene ablaufen, sind Softirqs, Tasklets und Timer.

ISR-Ebene. Interrupt-Service-Routinen laufen auf der ISR-Ebene ab. Dieser Code ist normalerweise nicht unterbrechbar, es sei denn, die Unterbrechbarkeit ist vom Entwickler explizit erwünscht. Der Kontext ist ebenfalls der Interrupt-Kontext. Auch den ISRs ist es damit untersagt, sich schlafen zu legen oder Funktionen aufzurufen, die einen Rechenprozess schlafen legen wollen.

Als Oberbegriff von Interrupt-Kontext und Prozess-Kontext wird oftmals auch der Begriff Kernel verwendet.

Zwei weitere Begriffe sind in diesem Zusammenhang noch zu erläutern: Kernel-Space und User-Space.

Kernel-Space. Als Kernel-Space bezeichnet man Speicherbereiche, auf die eine Routine innerhalb des Kernels direkt (über Zeiger) zugreifen kann, ohne besondere Funktionen zu bemühen. Nur der Kernel, also Code, der im Kernel-Kontext abläuft, hat direkten Zugriff auf den Kernel-Space. Selbst für Applikationen mit Superuser-Rechten ist er tabu.

User-Space. Die Speicherbereiche, auf die eine Applikation direkt, zum Beispiel über Zeiger, zugreifen kann, heißen User-Space.


Lizenz