# Expose der Bachelorarbeit über die Erstellung eines Linux-Kernel-Modules in der Programmiersprache *Rust*.
## Motivation
Das Betriebssystem Linux wurde seit seiner gesamten Entwicklung bisher in der Programmiersprache *C* geschrieben.
Dies hat den Nachteil, dass viele Sicherheitsprobleme entstanden sind und weiterhin bestehen.
Der Grund ist das unsichere und schwierige Speichermanagment, dass die Programmiert Sprache *C* mit sich bringt.
Diese Probleme von *C* wurde von der Programmiersprache *Rust* mit dem Ziel angegangen, möglichst viele dieser Logik- und Sicherheitsproblemen schon zur Compile-Zeit auszuschließen.
Nach mehr als einen Jahrzehnt seit der Veröffentlichung der *Rust* Sprache, wurde *Rust* nun auch als Sprache in dem Linux-Kernel zugelassen,
um nach und nach manche Sicherheitsprobleme im Linux-Kernel zu beheben.
## Forschungsfrage
Diese Bachelorarbeit möchte die Umstände betrachten, die entstehen, wenn man einen Device-Treiber als Linux-Kernel-Modul in der *Rust* Sprache schreibt.
Dabei soll betrachted werden, was die Sicherheitsprobleme bisheriger, in *C* geschriebener, Kernel-Module wahren und welche durch die Verwendung von *Rust* im vornherein ausgeschlossen währen.
Welche Probleme ergeben sich an den Schnittstellen des Moduls?
Welche Sicherheits-Probleme können durch eine Sprache mit sicheren Speicher-Management nicht geschlossen werden?
Ebenfalls soll dabei auf die Architektur des Linux-Kernels und die Schwierigkeiten und Herausforderungen,
die dies für die Entwicklung eines Moduls in *Rust* darstellt, eingegangen werden.
## Vorgehensweise
Um die Arbeit anzugehen, empfielt es sich, die Grundlagen und denn bisherigen Wissenstand in Bezug
auf den bisherigen Stand von der Verwendung von *Rust* im Linux-Kernel und in Devicetreibern
bestmöglich zu klären und diesen Stand während der Recherchephase festzuhalten.
Sobald sich die Recherchephase dem Ende neigt, sollte die Forschungsfrage nochmal präzisiert werden.
Das heißt, dass der konkrete Devicetreiber oder das konkrete Kernelmodul und die Aufgabe in Hinsicht auf diese Arbeit näher beschrieben werden sollen.
Anschließend kann mit einem festen Ziel in die Umsetzung gestarten werden.
In dieser sollen zwei rust module, die ggf. schon ein existierendes *C* Modul als vorbild haben, umgesetzt werden.
Falls jeweils ein *C* Modul bereits existiert sollen diese mit dem *Rust* implementaton verglichen werden.
Die Plattform auf der die beiden Module arbeiten sollen ist dabei ein *Raspberry Pi*.
Das erste soll sehr einfach gehalten werden, wie ein software treiber (z.b.: /dev/null treiber) oder ein hardware treiber (z.b.: led-treiber) im zweiten soll dann das beim Umstetzen des erste gelernete eingesetzt werden um etwas komplexeres zu implementieren wie zum Beispiel ein (LED-matrix-) Displaytreiber oder ein Treiber für Crypto-Hardware-Modul.
Nachdem die Forschungsfrage und das Arbeitsziel feststeht,
soll die sich daraus entstehende Arbeit in möglichst klare Arbeitspackete (Milestones) unterteil und als solche dokumentiert werden.
Dies dient dem Zweck, den Fortschritt der Arbeit kontrollierbar und besser dokumentierbar zu machen.
In regelmäßigen Abständen gemäß des geschätzten Zeitaufwands der Arbeitspakete soll der zeitliche Bedarf und Arbeitsaufwand refelektiert werden,
und falls daraus eine Zeitplansänderung hervorgeht, dies mit den Betreuern abgesprochen und dokumentiert werden.
Um während der Umsetzung die Qualität der Softwareentwicklung nachvollziehbar zu gestalten,
soll *Git* als Version-Kontroll-System zum Einsatz kommen, so wie ein Makefile in Verbindung mit einer pre-commit-hook.
Diese soll für und in *Rust* geschriebene Unittests ausführen, so wie gegebenfalls Benchmarks, um die Performanceenwicklung betrachten zu können.
## Vorläufige Gliederung
- Abstract
- Einleitung
- Motivation
- Zielsetzung und Forschungsfrage
- Aufbau der Arbeit
- Stand der Technik
- des Kernels
- der Rust Sprache
- von sicheren Treibern
- Konzept
- Szenarien
- Anforderungen
- Architektur
- Implementierung
- Vorgehen
- Komponenten
- Werkzeuge
- Evaluation
- der Sicherheit
- der Performence
- Fazit
- Ergebnisse
- Offene Frage
## Vorläufiger Zeitplan
- Vorbereiten - 1 Woche
- Einrichten von arbeitsumgebung und vorbereiten auf die rechereche, d.h. strukturierte Sammlung und notizen gestalltung ermöglichen.
- Recherche - 4 Wochen
- Materialsammlung und -sichtung
- Einarbeiten in Rust und den Linux-Kernel
- Zusammenfassen - 2 Wochen
- Ordnung und Aufarbeitung der Rechercheergebnisse
- Umsetzung - 4 Wochen
- Schreiben von Unittests für den entstehenden Code
- Implementierung des Kernel Moduls in Rust
- Verifizieren - 2 wochen
- Gezielte Suche nach Program- und Logigfehlern in der Software
- und ggf. Refactoring und Nacharbeitung
- Verfassen - 4 Wochen
- Ergebniss bisheriger arbeitsschritte documentieren und einordnen
- ggf. weiterführende Recherche
- Festlegen der finalen Gliederung
- Verfassen der schriftlichen Ausarbeitung
- Korregieren - 2 Wochen
- Text formatieren, Korrektur lesen und lesen lassen, Korrekturen einarbeiten
- Abschliessen - 1 Woche
- Drucken, Binden, Abgabe
## Literatur
### Rust
Steve Klabnik und Carol Nichols (2019): *The Rust Programming Language*. Online verfügbar unter: https://doc.rust-lang.org/book/title-page.html (abgerufen am 2021.09.19)
Tim McNamara (2021): *Rust in Action*. Online verfügbar unter: https://www.oreilly.com/library/view/rust-in-action/9781617294556/ (abgerufen am 2021.09.19)
### Linux
Kaiwan N. Billimoria (2021): *Linux Kernel Programming*. Online verfübar unter: https://www.oreilly.com/library/view/linux-kernel-programming/9781789953435/ (abgerufen am 2021.09.19)
Jack-Benny Persson (2021): *Linux System Programming Techniques*. Online verfügbar unter: https://www.oreilly.com/library/view/linux-system-programming/9781789951288/ (abgerufen am 2021.09.19)