Plan Szkolenia
Wprowadzenie
- krótki przegląd historii GNU/Linux
- licencjonowanie
- wersje jądra
- cykl wydawania
- gałęzie jądra
- główna linia (mainline)
- jądro vs. przestrzeń użytkownika
- mechanizm vs. polityka
- alternatywy dla sterowników jądra
- RTOS vs. Linux
Zarządzanie pamięcią
- pamięć wirtualna vs. fizyczna
- alokacja pamięci w jądrze
- strony (pages)
- strefy (zones)
- interfejs API
- slab
Poprawka jądra (Kernel Patch)
- cykl życia poprawki
- git
- źródła jądra
- tworzenie poprawki
- sprawdzanie poprawki
- naprawianie poprawki
- wysyłanie poprawki
- audyt kodu
Moduły jądra (Kernel Modules)
- uzyskiwanie źródeł jądra
- konfiguracja / kompilacja / instalacja
- sterowniki urządzeń (statycznie połączone, ładowane w trakcie działania)
- inicjalizacja / zakończenie
- licencjonowanie
- EXPORT SYMBOL GPL
- plik make poza drzewem (out of tree makefile)
- narzędzia do inicjalizacji modułów (module-init-tools)
- moduł w drzewie jądra
- Kconfig
- przekazywanie parametrów
- sparse
Sterowniki znakowe (Char Drivers)
- architektura
- interfejs użytkownik/jądro
- podsystem wejścia/wyjścia (I/O)
- VFS
- sysfs (urządzenia, bus, sterowniki, klasy),
- kobject / ktype / kset
- model sterowników jądra Linux
- pliki urządzeń
-
sterownik znakowy (char driver)
- inicjalizacja
- rejestracja
- otwieranie, zwalnianie
- cdev, cdev add, cdev del,...
- numery główne/podstawowe (major/minor)
- udev, udevmonitor, udevadm
Zaawansowane operacje sterowników znakowych (Advanced Character Driver Operations)
- ioctl
- unlocked ioctl
- compat ioctl
- interfejs API przestrzeni użytkownika
- interfejs API przestrzeni jądra
- cykl życia procesu
- sen / blokada
- zasypianie / budzenie
- kolejka oczekiwania (wait queue)
- efekt stada byków (thundering herd)
- poll / select
Debugowanie jądra (Kernel Debugging)
- debugowanie
-
debugowanie jądra
- wyszukiwanie binarne za pomocą git
- wsparcie do debugowania z jądra
- printk, syslogd, klogd, poziomy logów, ograniczenie częstotliwości, poziomy debugu, selektywne podsystemy debugu
- debugowanie poprzez zapytanie debugfs
- debugowanie oops, asercja oops
- Magic SysRq Key
- kgdb / kdb
- JTAG
Śledzenie (Tracing)
- gcov
- lcov
- oprofile
-
ftrace
- nop tracer
- function tracer
- sched switch tracer
- function graph tracer
- dynamic tracer
- trace-cmd / kernelshark
- perf
- LTTng
Przerwania (Interrupts)
- przerwania vs. sondowanie (polling)
- przerwanie
- sekcje programowe
- ponowne wejście (reentrancy)
- zdarzenia
- obsługa przerwań
- współużytkowane obsługę przerwań (shared interrupt handler)
- przepływ przerwania
- kontrola przerwania
Odroczenie pracy (Deferring Work)
- górne/dolne połowy (top/bottom halves)
- softirqs
- tasklets
- kolejki pracy (work queues)
- wątkowe przerwania (threaded interrupts)
Współbieżność (Concurrency)
- krytyczna sekcja/region (critical region/section)
- atomowe
- warunek wyścigowy (race condition)
- synchronizacja
- blokady (locking)
- rozwiązania blokad (locking solutions)
- zakleszczenie (deadlock)
- rywalizacja (contention)
- co blokować?
-
czym można posłużyć się?
- operacje atomowe
- spin locks
- reader-writer spin locks
- semafor (semaphore)
- binarny semafor (binary semaphore)
- mutex
- reader-writer semafor (reader-writer semaphore)
- zmienne zakończenia (completion variables)
- sekwencyjne blokady (sequential locks)
- dezaktywacja przywłaszczenia (disable preemption)
- porządkowanie i bariery (ordering and barriers)
Czas (Time)
- HZ
- Jiffies
- duże/male opóźnienia (big/small delays)
- timery jądra (kernel timers)
sprzętowe wejście/wyjście (Hardware I/O)
- porty wejścia/wyjścia (I/O Ports)
- pamięć wejścia/wyjścia (I/O Memory)
- jak radzić sobie z efektami ubocznymi dostępu do rejestrów?
Komunikacja użytkownik-jądro (User-Kernel Communication)
- put(get)_user()
- copy to(from)_user()
- Wejście/wyjście jądra (Kernel I/O)
- mapowanie pamięci
- procfs
- sysfs
- debugfs
- relayfs
- netlink
- ioctl
Przenośność (Portability)
- rozmiar słowa (word size)
- nieprzezroczyste typy (opaque types)
- signed/unsigned char
- wyrównanie danych (data alignment)
- promocja całkowita (integral promotion)
- ponowne użycie kodu (code reuse)
- endianess
- tick systemowy (system tick)
- rozmiar strony (page size)
- kolejność instrukcji (instruction ordering)
- SMP/preemption/high memory
Z wyjątkiem zaznaczonych inaczej, treść i plan kursu są udostępnione na licencji Uznanie autorstwa-Nekomercyjne-Użycie wzajemne 4.0 Międzynarodowe (CC BY-NC-SA 4.0).
Wymagania
- Podstawowa znajomość korzystania z systemu GNU/Linux jako użytkownika końcowego
- Podstawowa znajomość powłoki wiersza poleceń
- Podstawowa wiedza na temat programowania w przestrzeni użytkownika / aplikacji
- Średnio zaawansowana znajomość języka C
- Powinni uczestniczyć w szkoleniu Architektura wbudowanych systemów GNU/Linux (stosunkowo zalecane!) i/lub mieć dobrą znajomość omawianych tam tematów
Opinie uczestników (5)
Bardzo przydatne dodatkowe informacje
Grzegorz - Comp S.A.
Szkolenie - BLoC Pattern
Przetłumaczone przez sztuczną inteligencję
Edward is an awesome facilitator
Zibusiso Ncube - Agricatural Research Council
Szkolenie - Ionic 4 and Angular for Developers
Miguel's knowledge of the subject was extensive. He made the training easy to understand and the flow was balanced; adding on to each section with new features as needed. He covered everything that was asked and answered each and every question thoroughly. It was a very pleasant experience.
Paul Coaton - SEMPCheck Services
Szkolenie - Flutter Development Bootcamp with Dart
That the trainer adapts to our needs
Eduardo Fontecha - ORMAZABAL PROTECTION & AUTOMATION S.L.U.
Szkolenie - The Yocto Project - An Overview - hands-on
Rzeczowe odpowiedzi trenera poparte doświadczeniem programistycznym.