Kursüberblick
Dieses fünftägige Training kombiniert Hands-on Übungen mit Theorie, um grundlegende Konzepte von Gerätetreibern und Kernel-Interna zu illustrieren. Die Hands-on Sessions werden mit freier Software wie dem Yocto Projekt auf einer Zielhardware (z.B. Beagle Bone Black Rev. C http://beagleboard.org/BLACK) durchgeführt. Dies ermöglicht es Ihnen das Kursmaterial mit nach Hause zu nehmen und damit zu arbeiten. Die Konzepte und Befehle, welche notwendig sind um GNU/Linux Gerätetreiber effektiv zu schreiben und einzusetzen werden durch eine Kombination von Theorie und On the job Training beschrieben. Vom Zeitaufwand her ist es sicherlich sinnvoll nicht zu versuchen alles selbst herauszufinden, sondern von einem erfahrenen Trainer zu lernen. Nehmen Sie dazu noch die Fähigkeit Ihre eigenen Embeddded GNU/Linux Gerätetreiber bei Ihren Embedded-Entwicklungsprojekten einzusetzen mit nach Hause.
Zielgruppe
Manager, Projektleiter, Software-, Hardware-, Entwicklungs- und System-Ingenieure, Techniker und Interessierte an der Technologie, die so schnell wie möglich verstehen wollen wie GNU/Linux Gerätetreiber funktionieren.
Voraussetzungen
- Grundkenntnisse wie man ein GNU/Linux System (z.B. Ubuntu) im User Space verwendet
- Grundkenntnisse mit dem Umgang der Command Line Shell
- Grundkenntnisse von User Space/Anwendungsentwicklungen unter GNU/Linux
- Mittelmäßige C-Programmierkenntnisse
- Sie sollten Einführung in Embedded GNU/Linux - Systemarchitektur bis Echtzeit (EMBED1) besucht haben. (dringend empfohlen!) ...es sei denn Sie sind mit dem darin vorgetragenen Material schon sehr vertraut.
- Um dem Training folgen zu können sollten Sie Erfahrung mit GNU/Linux mitbringen (wie man den kernel baut, userspace, root file-system, tools).
Kursziele
Ziel dieses Kurses ist es, die erforderlichen Grundlagen zu vermitteln mainline GNU/Linux Gerätetreiber schreiben zu können. How-tos, Theorie und praktische Übungen gepaart mit Erfahrungsberichten geben Ihnen das nötige Know-How von Anfang an mit der Community zusammenzuarbeiten was nur eines der Erfolgsrezepte ist wenn man seine eigenen GNU/Linux Gerätetreiber schreiben und warten will/darf/muss.
Kursinhalt
Einführung
Kurzer Überblick über die Geschichte von GNU/Linux, Lizenzen, Kernel Versionierung, Kernel Release Zyklus, Kernel trees, Mainline, Kernel Space im Vergleich zu User Space, Mechanismen im Vergleich zu policy, Alternativen zu Kernel Treibern, Echtzeitbetriebssysteme in Vergleich zu Linux
Speicher Management
Virtueller im Vergleich zu Physikalischem Speicher, Speicherallokierung im Kernel: pages, zones, API, slab, kmalloc im Vergleich zu vmalloc
Kernel Patch
Wer schreibt den Kernel?, Lebenszyklus eines Patches, git, Kernel Sourcen, einen Patch erstellen - überprüfen - Fehler beheben - ausliefern, Wie funktionieren Code Audits beim Kernel?
Kernel Module
Kernel Sourcen herunterladen, konfigurieren, bauen, installieren, Gerätetreiber (statisch mit dem Kernel gelinkt, zur Laufzeit geladen), init, Lizenzen, EXPORT SYMBOL GPL, Makefile außerhalb vom Kernel tree, module-init-tools, Module im Kernel tree, Kconfig, LKM Parameterübergabe, sparse
Char Treiber
Architektur, User/Kernel Interface, I/O Subsystem, VFS, sysfs (devices, bus, drivers, classes), kobject, ktype, kset, Linux Kernel Driver Modell, Device files
- Char Treiber
- Initialisierung
- Registrierung
- Open, Release
- cdev, cdev add, cdev del,...
- major/minor numbers
- udev, udevmonitor, udevadm
Fortgeschrittene Operationen bei Character Treibern
ioctl, unlocked ioctl, compat ioctl, user space API, kernel space API, Lebenszyklus eines Prozesses, sleeping/blocking, sleeping/waking up, wait queue, thundering herd, poll/select
Kernel Debuggen
bug, debugging, Den Kernel debuggen
- binäre Suche mit git
- Debug Unterstützung vom Kernel
- printk syslogd, klogd, loglevels, rate limit, debug levels, debug selective subsystems
- Debuggen durch Abfragen (querying) debugfs
- oops Debugging, oops aufrufen
- Magic SysRq Key
- kgdb/kdb
- JTAG (optional)
Tracing
- gcov
- lcov
- oprofile
- ftrace
- nop tracer
- function tracer
- sched switch tracer (viewer)
- function graph tracer
- dynamic tracer
- perf
- LTTng
- Kernel Probes
- Kprobes
- JProbes
- KretProbes
Interrupts
Interrupts im Vergleich zu Polling, interrupt, program sections, reentrancy, events, interrupt handler, shared interrupt handler, interrupt flow, interrupt control
Deferring Work
top/bottom halves, softirqs, tasklets, work queues, kernel thread, threaded interrupts
Concurrency
critical region/section, atomic, race condition, synchronization, locking, locking Lösungen, deadlock, contention, Was soll man beschützen?
- atomic operations
- spin locks
- reader-writer spin locks
- semaphore
- binary semaphore
- mutex
- reader-writer semaphore
- completion variables
- sequential locks
- RCU
- disable preemption
- orderig and barriers
Zeit
HZ, Tick-less Kernel, Jiffies, große/kleine Verzögerungen, Kernel Timer, High-res Timer
Hardware I/O
I/O Ports, I/O Memory, Was macht man gegen sogenannte ”side effects” wenn man Register zugreifen muss?
User-Kernel Kommunikation
put(get) user(), copy to(from) user(), Kernel I/O, memory mapping, procfs, sysfs, debugfs, relayfs, netlink, ioctl
Portierbarkeit
word Größe, opaque Typen, signed/unsigned char, data alignment, integral promotion, Wiederverwendung von Code, endianess, system tick, Pagegröße, instruction ordering, SMP/preemption/high memory