Fachprojekt „Systemsoftwaretechnik”

00b - Der Linux-Kern

Alexander Krause

07.04.2025
🚀 by Decker

Warum eigentlich Linux?

  • aktive und schnelle Entwicklung
    ⇒ riesige Entwicklungsgemeinschaft
  • Vielseitigkeit & Portabilität
    ⇒ Smart-TVs, Thermostate, E-Reader, Infotainment, ...
  • Skalierbarkeit
    ⇒ Linux für Raspberry Pi bis Supercomputer
  • aktive Forschung
    ⇒ Linux als Forschungsgegenstand und Plattform
  • Performance & Effizienz
    ⇒ 100% der Top500 Supercomputer Linux-basiert
  • Verbreitung [1, 2, 3]
    ⇒ ~80% Webserver, ~70% Smartphones

Was ist eigentlich Linux? [4, 5]

gen/linux-structure-simple-crop-01.svg

Was ist eigentlich Linux? [4, 5]

gen/linux-structure-simple-crop-02.svg

Was ist eigentlich Linux? [4, 5]

gen/linux-structure-simple-crop-03.svg

Was ist eigentlich Linux? [4, 5]

gen/linux-structure-simple-crop-04.svg

Der Linux-Kern (Linux Kernel)

  • Eckdaten
    • ursprünglich 1991 von Linus Torvalds entwickelt
    • veröffentlicht unter der GPLv2 [6]
  • Struktur [7, 8, 9]
    • dynamischer, monolithischer Betriebssystemkern
    • dynamisch ladbare Module
    • (logische) Aufteilung in Subsysteme:
      • Prozessverwaltung
      • Speicherverwaltung
      • Virtuelles Dateisystem
      • Gerätetreiber

Der Linux-Kern (Linux Kernel)

  • Eckdaten
    • ursprünglich 1991 von Linus Torvalds entwickelt
    • veröffentlicht unter der GPLv2 [6]
  • Struktur [7, 8, 9]
    • dynamischer, monolithischer Kernel
    • dynamisch ladbare Module
    • (logische) Aufteilung in Subsysteme:
      • Prozessverwaltung
      • Speicherverwaltung 
      • Virtuelles Dateisystem
      • Gerätetreiber
gen/linux-tree-crop-01.svg

Der Linux-Kern (Linux Kernel)

  • Eckdaten
    • ursprünglich 1991 von Linus Torvalds entwickelt
    • veröffentlicht unter der GPLv2 [6]
  • Struktur [7, 8, 9]
    • dynamischer, monolithischer Kernel
    • dynamisch ladbare Module
    • (logische) Aufteilung in Subsysteme:
      • Prozessverwaltung
      • Speicherverwaltung
      • Virtuelles Dateisystem
      • Gerätetreiber
gen/linux-tree-crop-02.svg

Der Linux-Kern (Linux Kernel)

  • Eckdaten
    • ursprünglich 1991 von Linus Torvalds entwickelt
    • veröffentlicht unter der GPLv2 [6]
  • Struktur [7, 8, 9]
    • dynamischer, monolithischer Kernel
    • dynamisch ladbare Module
    • (logische) Aufteilung in Subsysteme:
      • Prozessverwaltung
      • Speicherverwaltung
      • Virtuelles Dateisystem
      • Gerätetreiber
gen/linux-tree-crop-03.svg

Der Linux-Kern (Linux Kernel)

  • Eckdaten
    • ursprünglich 1991 von Linus Torvalds entwickelt
    • veröffentlicht unter der GPLv2 [6]
  • Struktur [7, 8, 9]
    • dynamischer, monolithischer Kernel
    • dynamisch ladbare Module
    • (logische) Aufteilung in Subsysteme:
      • Prozessverwaltung
      • Speicherverwaltung
      • Virtuelles Dateisystem
      • Gerätetreiber
gen/linux-tree-crop-04.svg

Der Linux-Kern (Linux Kernel)

  • Eckdaten
    • ursprünglich 1991 von Linus Torvalds entwickelt
    • veröffentlicht unter der GPLv2 [6]
  • Struktur [7, 8, 9]
    • dynamischer, monolithischer Kernel
    • dynamisch ladbare Module
    • (logische) Aufteilung in Subsysteme:
      • Prozessverwaltung
      • Speicherverwaltung
      • Virtuelles Dateisystem
      • Gerätetreiber
gen/linux-tree-crop-05.svg

Entwicklung

Community (Familie)

  • große Entwicklungsgemeinschaft

    ⇒ Privatpersonen, Wissenschaft, Unternehmen, …

  • organisiert in einer Maintainer-Hierarchie
  • Kommunikation vorrangig per E-Mailverteiler (Linux Kernel Mailing List, LKML)
fig/tux-construction-worker.svg
fig/tux-shaded.svg
fig/tux-emergency-paramedic.svg
fig/tux-mad-nurse.svg
fig/tux-mad.svg

Entwicklungsprozess [10]

  • neue,stabile Versionen erscheint alle 2-3 Monate
  • kontinuierliche (Weiter-) Entwicklung der Funktionalität
    • Einreichung in Form von Patches
    • Diskussion per Linux Kernel Mailing List (LKML)
    • Nachbesserung der Patches
    • Aufnahme während Mergefenster

Entstehung eines neuen Release Candidate (vX.Y-rc1)

  • neue, stabile Versionen erscheinen alle 2-3 Monate
    • Veröffentlichung der stabilen Version vX.W
    • Mergefenster für nächste Version vX.Y für ca. 1 Woche
    • Stabilisierungsphase über mehrere Wochen
      • ca. einmal die Woche eine neue Vorabversion
      • vX.Y-rc1vX.Y-rc2 ⇒ …
      • vX.Y-rc7 ⇒ … ⇒ Stable Release vx.Y

Einreichung einer Änderung

  • kontinuierliche (Weiter-) Entwicklung der Funktionalität via Patches
  • Diskussion per Linux Kernel Mailing List (LKML)
  • Aufnahme von …
    • großen Änderungen während des Mergefensters
    • kleinen Änderungen/Fixes immer
diff --git a/drivers/tty/serial/stm32-usart.c b/drivers/tty/serial/stm32-usart.c
index 1ec5d8c3aef8..0854ad8c90cd 100644
--- a/drivers/tty/serial/stm32-usart.c
+++ b/drivers/tty/serial/stm32-usart.c
@@ -965,10 +965,8 @@ static void stm32_usart_start_tx(struct uart_port *port)
 {
        struct tty_port *tport = &port->state->port;
 
-       if (kfifo_is_empty(&tport->xmit_fifo) && !port->x_char) {
-               stm32_usart_rs485_rts_disable(port);
+       if (kfifo_is_empty(&tport->xmit_fifo) && !port->x_char)
                return;
-       }

Umsetzung mittels Versionskontrolle

Die einzelnen Schritte zum „eigenen” Linux-Kern

gen/dev-process-steps-crop-01.svg

Die einzelnen Schritte zum „eigenen” Linux-Kern

gen/dev-process-steps-crop-02.svg

Editor

Editoren mit und ohne grafischer Oberfläche

  • leichtgewichtig
  • einfach zu bedienen
  • Beispiele: vim, nano, geany, gedit, kate, ...

Entwicklungsumgebungen

  • Schwergewichtig
  • bieten meist gute Code-Vervollständigung und Cross-Referenzierung
  • Beispiele: Eclipse, Visual Studio Code, ...

🚨 Es ist schwierig!
Bringt die Indezierung nicht selten an ihre Grenzen.

⇒ Sucht Euch einen aus! 😃

Versionskontrollsystem des Linux-Kernels 

  • Git fig/git-logo.svg
    • verteilte Versionskontrolle
    • Jede(r) Teilnehmer:in besitzt die komplette Historie
    • Sicherung von Daten und deren (alten) Zuständen
    • Zusammenführung paralleler Entwicklung
  • Historie
    • Initiale Version von April 2005
    • Ursprünglich von Linus Torvalds entwickelt
    • Zweck war und ist die Verwaltung des Quellcodes des Linux-Kerns
    • Erster Commit für den Linux-Kern: 16.04.2005

Grundprinzip von Git

  • Sammlung an Dateien in einem Repository
  • Sicherung vollständiger Daten jeder Version (commit)
  • Jede Version kennt ihren Vorgänger (parent)
  • Parallele Entwicklung und Abzweigung von Versionsserien (branches)
  • Zusammenführung von Versionsserien (merge)
gen/git-example-crop-01.svg

Grundprinzip von Git

  • Sammlung an Dateien in einem Repository
  • Sicherung vollständiger Daten jeder Version (commit)
  • Jede Version kennt ihren Vorgänger (parent)
  • Parallele Entwicklung und Abzweigung von Versionsserien (branches)
  • Zusammenführung von Versionsserien (merge)
gen/git-example-crop-02.svg

Grundprinzip von Git

  • Sammlung an Dateien in einem Repository
  • Sicherung vollständiger Daten jeder Version (commit)
  • Jede Version kennt ihren Vorgänger (parent)
  • Parallele Entwicklung und Abzweigung von Versionsserien (branches)
  • Zusammenführung von Versionsserien (merge)
gen/git-example-crop-03.svg

Grundprinzip von Git

  • Sammlung an Dateien in einem Repository
  • Sicherung vollständiger Daten jeder Version (commit)
  • Jede Version kennt ihren Vorgänger (parent)
  • Parallele Entwicklung und Abzweigung von Versionsserien (branches)
  • Zusammenführung von Versionsserien (merge)
gen/git-example-crop-04.svg

Grundprinzip von Git

  • Sammlung an Dateien in einem Repository
  • Sicherung vollständiger Daten jeder Version (commit)
  • Jede Version kennt ihren Vorgänger (parent)
  • Parallele Entwicklung und Abzweigung von Versionsserien (branches)
  • Zusammenführung von Versionsserien (merge)
gen/git-example-crop-05.svg

Hilfestellungen zum Umgang mit Git

Die einzelnen Schritte zum „eigenen” Linux-Kern

gen/dev-process-steps-crop-03.svg

Die einzelnen Schritte zum „eigenen” Linux-Kern

gen/dev-process-steps-crop-04.svg

Die einzelnen Schritte zum „eigenen” Linux-Kern

gen/dev-process-steps-crop-05.svg

Diversität des Linux-Kerns

Der Linux-Kernel unterstützt …

  • 20 CPU Architekturen
  • 70 Dateisysteme
  • 40 Ethernet Gerätetreiber

🚨 nur ein Bruchteil der gesamten Codebasis wird tatsächlich pro System benötigt🚨

🚨 Kern auf Bedürfnisse (Hardware, Komponenten, …) zuschneiden🚨

Varianten-Management (Maßschneiderung)

Konfiguration des Linux-Kerns [11, 12]

  • Kconfig = Konfigurationssprache
  • verwaltet alle Compile-Zeit Konfigurationsoptionen
  • Berücksichtigt Abhängigkeiten und setzt diese durch
  • Erstellung der Konfiguration (durch Tools wie menuconfig)

🚨 Konfigurationen nicht über verschiedene Kernel Versionen hinweg stabil 🚨

Kconfig – Aufbau

fig/menuconfig.png
Kconfig-Menü

Kconfig - Verwendung

Bedienung

  • = Beschreibung / Tipp anzeigen
  • = abbrechen / beenden
  • = Suche

Symbole

  • < > keine Abhängigkeiten
  • [ ] kann einkompiliert (y) werden oder nicht (n)
  • { } als Modul (m) oder einkompiliert (y) benötigt
  • - - einkompiliert (y) benötigt

Makefiles des Linux-Kerns [13]

  • Makefile
    • beschreibt Beziehung zwischen Dateien
    • definiert Kommandos zum Updaten von Dateien
    • Grundlage für die Nutzung von GNU make
fig/gnu-tux-baby.png
© FSE, Inc. GPLv2
  • Einbettung ins Dateisystem
    • Pro Verzeichnis ein Makefile ⇒ „Wie soll etwas gebaut werden”
    • Pro Verzeichnis eine Kconfig ⇒ „Was soll gebaut werden”
gen/dirtree-linux-all-crop.svg

Makefiles des Linux-Kerns [13]

  • Makefile
    • beschreibt Beziehung zwischen Dateien
    • definiert Kommandos zum Updaten von Dateien
    • Grundlage für die Nutzung von GNU make
fig/gnu-tux-baby.png
© FSE, Inc. GPLv2
  • Hilfreiche Target
    • menuconfig Edit config with menu-based program
    • bzImage Build compressed kernel image
    • vmlinux Build bare kernel
    • modules Build all modules
gen/dirtree-linux-short-crop.svg

Die einzelnen Schritte zum „eigenen” Linux-Kern

gen/dev-process-steps-crop-06.svg

Die einzelnen Schritte zum „eigenen” Linux-Kern

gen/dev-process-steps-crop-07.svg

Die einzelnen Schritte zum „eigenen” Linux-Kern

gen/dev-process-steps-crop-08.svg

Linux in der virtuellen Maschine (VM)

  • Virtualisierung

    Abstraktionsschicht zwischen
    Hardware und Anwendung(en)

  • Emulation

    funktionelles Nachbilden eines System durch ein anderes

Vollständige Virtualisierung

  • Simulation der Hardware (transparente Virtualisierung) [14] [15, S. 627 ff.]
  • Nachbildung echter Hardwareschnittstellen
  • Hypervisor als Virtualisierungsmanager
  • bare-metal oder ② hosted
gen/vm-structure-crop-01.svg
gen/vm-structure-crop-02.svg

Paravirtualisierung

  • Variante der vollst. Virtualisierung
  • Gastsystem weiß, dass es virtualisiert läuft
  • spezielle Hypervisor-Schnittstelle für bessere Performance, keine Nachbildung
  • erfordert OS-Anpassungen

QEMU/KVM

QEMU [16]

  • freier, open source Emulator
  • erstellt das virtuelle System (VM), inkl.
    CPU, Speicher und Geräte

KVM [17]

  • Virtualisierungsmodul im Linux Kernel

  • Schnittstelle zwischen VM und Hardware

  • ermöglicht Paravirtualisierung

Nutzung in Kombination

stud@sst:~  qemu-system-x86_64 -enable-kvm [options] [disk_image]

QEMU/KVM

Steuerung der virtuellen Maschine

Kommandos werden mit Escape Sequenz eingeleitet: +

  • = Hilfe anzeigen
  • = Emulation beenden
  • = Konsolenzeitstempel umschalten
  • = Abbruch senden (Magic SysRq [⇒siehe Aufgabe 1 ])

QEMU/KVM

  1. Virtuelle Festplatte einrichten [18]
    • Datei in der Festplatteninhalte der VM gespeichert werden
    • Speicherplatz Optimierung durch qcow2 Dateiformat
    stud@sst:~ qemu-img create -f qcow2 FILENAME.img [SIZE]
  2. Distribution installieren [18]
    • Minimaler Debian-Installer: Kernel + Installationprogramm (Ramdisk)
    • Nutzung des Debian Spiegels zum Nachladen weiterer Programme
    stud@sst:~ qemu-system-x86_64 -drive file=FILENAME.img <...>
                    -cdrom INSTALLER.iso

QEMU/KVM

  1. Booten des Gastsystems [18]
    • Booten ohne Ramdisk
    • Nutzung des eigenen Kernels
    stud@sst:~ qemu-system-x86_64 -drive file=FILENAME.img <...> -kernel CUSTOM_KERNEL

Hinweise für unser Setup (Siehe virtio [17])

  • boot.sh Skript mit passenden QEMU Flags unter /fs/proj/sst/

  • Paravirtualisierung mittels Virtio ⇔ Kernel benötigt virtio-Treiber

  • Freigabe von Verzeichnissen zwischen Host und Gast per Plan 9 Folder Sharing

    (Siehe Aufgabezettel)

Aufgabe 0

A0 - Der Linux-Kern

Ziele

  • Debian VM mit selbstkonfiguriertem Kernel
  • Dateienaustausch zwischen Host-System und VM
  • Möglichst kleine Kernelkonfiguration (Challenge)

Hinweise

  • Linux-Kern ist ein sehr großes Projekt ⇒ nur Tag v6.1.132 klonen (siehe git clone)
  • Ablage & Bauen des Linuxkerns lokal unter /fs/scratch/XXX
  • Achtet auf Anforderungen an den Linux-Kern
  • Abgabe der Kern-Konfiguration, bitte nur die .config Datei einchecken!

🚨 kein Backup von /fs/scratch, aber schneller 🚨

Literaturverzeichnis

[1] Wired, August 2016. Verfügbar unter: https://www.wired.com/2016/08/linux-took-web-now-taking-world/
[2] Verfügbar unter: https://gs.statcounter.com/os-market-share/mobile/worldwide
[3] Verfügbar unter: https://w3techs.com/technologies/overview/operating_system
[4] A. Silberschatz, P. B. Galvin, und G. Gagne, Operating System Concepts, 10th Aufl. Wiley, 2018.
[5] J. Corbet, A. Rubini, und G. Kroah-Hartman, Linux Device Drivers, 3rd Edition. O’Reilly Media, Inc., 2005.
[6] Verfügbar unter: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
[7] D. P. Bovet und M. Cesati, Understanding The Linux Kernel, 3rd Aufl. O’Reilly Media Inc., 2005.
[8] R. Love, Linux Kernel Development, 3rd Aufl. Addison-Wesley, 2010.
[9] Verfügbar unter: https://linux-kernel-labs.github.io/refs/heads/master/lectures/intro.html#linux-source-code-layout
[10] Verfügbar unter: https://www.kernel.org/doc/html/v6.1/process/2.Process.html#the-big-picture
[11] Verfügbar unter: https://www.kernel.org/doc/html/v6.1/kbuild/kconfig-language.html
[12] Verfügbar unter: https://opensource.com/article/18/10/kbuild-and-kconfig
[13] Verfügbar unter: https://www.kernel.org/doc/html/v6.1/kbuild/makefiles.html
[14] K. Scarfone, M. Souppaya, und P. Hoffman, „Guide to Security for Full Virtualization Technologies“, National Institute of Standards; Technology, Jan. 2011. Verfügbar unter: https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-125.pdf
[15] W. Stallings, Operating Systems: Internals and Design Principles, 9th Aufl. Pearson, 2017.
[16] Verfügbar unter: https://www.qemu.org/docs/master/index.html
[17] Verfügbar unter: https://www.linux-kvm.org/
[18] Verfügbar unter: https://wiki.archlinux.org/title/QEMU
Logo Sys
Fachprojekt „Systemsoftwaretechnik”