FAU UnivIS
Techn. Fak. Dep. Informatik

Systemaufruf-Generierung mit TableGen

In der ersten KSS Übung haben wir gemeinsam eine Domänenanalyse für die Systemaufrufschnittstelle von StuBSmI durchgeführt. Dabei wurden verschiedene funktionale bzw. nicht-funktionale Eigenschaften dieser Betriebssystem-Teilkomponente identifiziert und verschiedene Implementierungsalternativen durchgesprochen. Eines der Ergebnisse der ersten Übung ist ein partielles Feature Modell (FM) für die Systemaufrufschnitstelle, was in dieser Aufgabe als konzeptionelle Basis zur Generierung von Code mittels TableGen dienen soll.

Code-Generierung mit TableGen

TableGen ist eine datenbasierte Beschreibungssprache für domänenspezifische Informationen. Die beschriebenen Daten können anschließend mittels sogenannter TableGen-Backends in einem vordefinierten Format abgerufen und verarbeitet werden. TableGen ist Teil der LLVM Compiler Infrastructure und wird dort verwendet, um Eigenschaften einzelner Maschienenbefehle, wie beispielsweise die verwendten Register, zu beschreiben. In KSS Aufgabe 2 setzen wir auf selbiges Prinzip und werden über in TableGen beschriebene Systemaufrufe und eines eigens programmierten Backends den Code der Sytemaufruf-Wrapper und des Dispatchers generieren.

Die TableGen Sprache setzt auf ein einfaches Typsystem (siehe „TableGen Language Introduction“). Den Kern der Sprache bilden sogenannte „Records“, die sich wiederum aus „Classes“ bwz. „Definitions” zusammensetzen. „Classes“ sind abstrakte „Records” und können verwendet werden, um weitere „Records” zu erstellen bwz. zu beschreiben. „Definitions” sind konkrete „Records” und tragen i.A. keine undefinierten Werte. Mehr Informationen über die TableGen Sprache und verwandter Werkzeuge findet man in der LLVM Dokumentation.

Aufgabenbeschreibung

Ziel dieser Aufgabe ist es, den Code der Systemaufrufschnittstellen zwischen Benutzer und Betriebssystem mit TableGen zu generierern. Im folgenden Ablaufmodell eines Systemaufrufs werden wir also die Systemaufruf-Wrapper (2) und den Systemaufruf-Dispatcher (3) in verschiedenen Varianten generieren.



Bevor wir anfangen mit TableGen zu arbeiten: Für Syntax Highlighting in z.B. Vim oder Emacs stellen die LLVM Entwickler neben weiteren Entwicklungshilfen entsprechende Dateien zur Verfügung.

Schritt 1: Beschreibung der Daten in TableGen

Bevor wir mit der Code-Generierung anfangen können, müssen die Systemaufrufe in TableGen beschreiben werden. Dabei beginnen wir nicht auf der grünen Wiese, sondern setzen auf dem kss-tablegen Repositorium in unserem Gitlab auf. Es bietet sich an, das geklonte Repositorium dann als git-submodule in euer StuBSmI Hauptverzeichnis einzubinden. In der Datei system-api.td findet ihr eine Vielzahl an vordefinierten Hilfsklasse, Datentypen für die Schnittstellenbeschreibung der Systemaufrufe und die dazugehörigen Definitionen. Erst in KSS-Aufgabe 3 muss diese Datei erweitert werden. Für die aktuelle Aufgabe ist es jedoch wichtig, die Datenbeschreibungen zu verstehen, um sie im folgenden Schritt für die Code-Generierung zu verwenden.

Schritt 2: Code-Generierung mit TableGen

In dem KSS-TableGen Repositorium findet ihr unter src/kss-tablegen.cc die initiale Vorgabe zur Code-Generierung. Hier muss der Code dem Datenmodell der system-api.td entsprechend erweitert werden, um abängig von einer vom Benutzer spezifizierten Konfiguration (i.e., Instanz des FMs) Code zu generieren. Die Konfiguration des FMs könnt ihr z.B. über die Kommandozeile realisieren. Informationen über das LLVM-TableGen C++-Interface findert ihr bisher nur in der Doxygen Dokumentation von LLVM (Record, RecordKeeper, RecordVal).

Es sollen jeweils zwei Varianten der Parameterübergabe, Kernaktivierung und Fehlercodes unseres Feature Modells generierbar sein.