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
 35 godzin

Liczba uczestników


cena netto za uczestnika

Opinie uczestników (5)

Propozycje terminów

Powiązane Kategorie