🧬 Linux Kernel
🏗 Architektur
📦 Kerneltypen
Typ | Beschreibung |
---|---|
Monolithisch | Alles in einem Kernelimage, inkl. Treiber |
Modular | Monolithisch mit ladbaren Modulen (*.ko) zur Laufzeit |
Linux ist modular und monolithisch – es erlaubt dynamisches Nachladen von Modulen, behält aber die monolithische Struktur.
🧱 Architektur-Übersicht
Anwendungen
└─ Systembibliotheken (libc)
└─ System Call Interface (SYSCALL)
└─ Kernelspace:
├─ Prozessverwaltung
├─ Speicherverwaltung (MMU)
├─ Gerätetreiber
├─ Dateisysteme
└─ Netzwerkschnittstellen
🕳 System Calls
- Ermöglichen Übergang von Userspace in Kernelspace
- Beispiel:
read()
,write()
,open()
,ioctl()
🗃 Kernel-Sourcen
- Bezugsquelle: https://www.kernel.org
- Verzeichnisstruktur:
/usr/src/linux
├── arch/ # Architektur-spezifisch (z. B. arm, x86)
├── drivers/ # Gerätetreiber
├── fs/ # Dateisysteme
├── include/ # Headerdateien
├── kernel/ # Kernelkern: Scheduler, Signals
└── net/ # Netzwerkstack
⚙️ Konfiguration & Kompilierung
Konfigurationstools:
make menuconfig
(Textoberfläche)make xconfig
(GUI)
Konfigurationsdateien:
.config
: Ergebnis der Konfiguration- Mit Yocto:
bitbake -c menuconfig virtual/kernel
Kernel bauen:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- zImage
Module installieren:
make INSTALL_MOD_PATH=/pfad/ modules_install
📦 Kernelmodule
- Dynamisch ladbare Erweiterungen (*.ko)
- Einbindung in Kernel zur Laufzeit mit
insmod
,modprobe
Minimalbeispiel:
#include <linux/module.h>
#include <linux/init.h>
static int __init hello_init(void) {
pr_info("Hello Kernel\n");
return 0;
}
static void __exit hello_exit(void) {
pr_info("Bye Kernel\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
🧪 Kernel starten & Debugging
-
Erster Prozess:
/sbin/init
-
Runlevel steuern Startverhalten
-
Tools:
dmesg
– Kernelmeldungenlsmod
,modinfo
,insmod
,rmmod
– Modulinformationen
Diese Grundlagen bereiten auf die Entwicklung eigener Kernelmodule, Platform-Driver und Device-Tree-Integration vor.