Kurs na praktycznych przykładach dostarcza wiedzę niezbędną do rozpoczęcia projektowania i implementacji sterowników urządzeń w jądrze Linux. Omawiana jest organizacja kodu źródłowego sterowników, sposoby komunikacji jądra z przestrzenią użytkownika, usługi i mechanizmy dostarczane przez jądro sterownikom, oraz sposoby debugowania kodu. Praktyczne ćwiczenia przeprowadzane są na komputach o architekturze ARM, zarówno fizycznyh, jak i emulowanych.
Cel szkolenia:
- poznanie zasad działania jądra Linux;
- poznanie sposobów analizowania i debugowania jądra;
- poznanie algorytmów, mechanizmów i ich warstw: planisty, wywołań systemowych, zarządzania pamięcią;
- poznanie zasad i dobrych praktyk związanych z tworzeniem sterowników w Linuksie;
- wykształcenie praktycznych umiejętności pisania sterowników (obsługi pamięci, przerwań, komunikacji z przestrzenią użytkownika, współbieżności itp.);
- poznanie frameworków dostarczanych przez jądro: model sterowników urządzeń, urdządzenia klas: misc, input, net, framebuffer i inne;
- nabycie praktycznych umiejętności programowa w jądrze, debugowania go i rozwiązywania problemów.
Program szkolenia:
- Wprowadzenie do programowania w jądrze Linux.
- Przygotowanie środowiska pracy, programy pomocnicze i ich wersje.
- Praca z kodem źródłowym jądra i zewnętrznych modułów w środowisku Eclipse.
- Uruchamianie jądra systemu, rola bootloadera. U-BOOT.
- Moduły jądra - zarządzanie modułami, organizacja kodu jądra.
- Zarządzanie pamięcią, przestrzeń adresowa, alokacja pamięci, działanie systemu w środowisku z niewystarczającą ilością pamięci (kmalloc, kzalloc, vmalloc, get_free_pages, ioremap, SLAB, SLUB, SLOB, oom_killer)
- Komunikacja ze sprzętem (wejście-wyjście).
- Komunikacja z przestrzenią użytkownika: wywołania systemowe. Działanie wywołań systemowych w architekturach x86 i ARM.
- Procesy: pamięć wirtualna, przestrzeń adresowa procesu, cykl życia procesu, tworzenie procesu, atrybuty procesu, task_struct, implementacja wątków.
- Planista: O(1), CFQ, cgroup, implementacja planisty, klasy szeregowania procesów (SCHED_OTHER, SHCED_FIFO, SCHED_RR, SCHED_DEADLINE), priorytety procesów, afiniczność.
- Wirtualny system plików - budowa i implementacja.
- Zaawansowane operacje na plikach w VFS - komunikacja z przestrzenią użytkownika - metody synchroniczne i asynchroniczne, ioctl, mmap, AIO.
- Czas w jądrze systemu: pomiar upływu czasu, wstrzymanie uruchomienia - usypianie na określony czas, oczekiwanie na zdarzenia, timery, timery wysokiej rozdzielczości.
- Przerwania: sposób obsługi i rejestracji przerwań w jądrze, dolne połówki (softirq, tasklet, workqueue), przerwania w wątkach (RT).
- Wejście-wyjście oparte na przerwaniach: synchronizacja proces-jądro, waitqueue, przykłady rzeczywistych sterowników,
- Wielowątkowość i synchronizacja zasobów (zmienne atomowe, mutexy, semafory, spinlock, zmienne warunkowe, algorytmy niewymagające blokowania - RCU).
- Frameworki dla typowych klas urządzeń.
- Zunifikowany model urządzeń w Linuksie. W jaki sposób system widzi sprzęt i organizuje urządzenia? Start systemu, magistrala, sterownik magistrali, sterownik kontrolera, urządzenie, automatyczne kojarzenie sterowników z urządzeniami,
- Magistrala platform. Specyfikowanie urządzeń przy pomocy Device-Tree.
- Magistrala PCI, specyfika urządzeń i sterowników PCI.
- Magistrala USB, specyfika urządzeń i sterowników USB.
- Urządzenia blokowe - struktura sterownika i wydajność.
- Urządzenia sieciowe - struktura sterownika, kontrola transmisji, interfejs gniazd, strojenie parametrów,
- Podsystem urządzeń wejściowych interfejsu użytkownika (input).
- Sterownik bufora ramki (grafika).
- DMA, zasada działania, alokacja pamięci dla DMA, synchronizacja.
- Debugowanie jądra systemu.
Szkolenie odbędzie się w dniach 16-19 lutego 2015 r. w Warszawie. Cena - 3500 zł.