Course Code: ldd
Duration: 35 hours
Prerequisites:
- Základní zkušenost s používáním systému GNU/Linux jako koncový uživatel
- Základní povědomí o příkazovém řádku
- Základní znalost vývoje v uživatelském prostoru / aplikacích
- Středně pokročilé znalosti programování v C
- Měl by jste dříve absolvoval kurzu Architektura systémů Embedded GNU/Linux (důrazně doporučeno) a/nebo mít dobré porozumění tématům uvedeným v tomto kurzu
Overview:
Popis
Tento pětidenní školicí kurz kombinuje praktická cvičení s výukou, aby ilustroval koncepty interní struktury jádra GNU/Linuxu a vývoje ovladačů zařízení. Je navržen tak, aby vás rychle seznámil s danou problematikou. Popisujeme procesy, koncepty a příkazy nezbytné pro psaní ovladačů zařízení GNU/Linux prostřednictvím kombinace teorie a praktického školení.
Nevynalézejte kolo znovu, ale učte se od zkušeného trenéra a odneste si funkční znalosti a schopnost je efektivně použít ve vašem vlastním projektu zabudovaného vývoje.
Kdo by měl navštívit?
Lidé s zájmem o vývoj nebo hodnocení vývoje ovladačů zařízení GNU/Linux, kteří jsou za to zodpovědní, jako softwaroví inženýři, fieldoví inženýři, manažeři (projektů), hardware inženýři.
Course Outline:
Úvod
- rychlá historie GNU/Linux
- licence
- verzování jádra
- cyklus vydávání
- stromy jádra
- hlavní větve (mainline)
- jádro vs. uživatelský prostor
- mechanismus vs. politika
- alternativy ovladačů jádra
- RTOS vs. Linux
Správa paměti
- virtuální paměť vs. fyzická paměť
- alokace paměti v jádře
- stránky
- zóny
- API
- slab allocator
Záplaty jádra
- životní cyklus
- git
- zdrojový kód jádra
- vytvoření záplaty
- kontrola záplaty
- oprava záplaty
- doručení záplaty
- auditovaný kód
Moduly jádra
- stažení zdrojového kódu jádra
- konfigurace/sestavení/instalace
- ovladače zařízení (staticky linkované, načítány za běhu)
- inicializace/odchod
- licence
- EXPORT SYMBOL GPL
- Makefile mimo strom jádra
- module-init-tools
- modul v stromu jádra
- Kconfig
- předávání parametrů
- sparse
Ovladače znakových zařízení (Char Drivers)
- architektura
- rozhraní uživatel/jádro
- podsystem I/O
- VFS (Virtual File System)
- sysfs (zařízení, sběrnice, ovladače, třídy),
- kobject/ktype/kset
- model ovladače linuxového jádra
- soubory zařízení
-
ovladač znakových zařízení
- inicializace
- registrace
- otevření, uzavření
- cdev, cdev add, cdev del,...
- hlavní/mínor čísla
- udev, udevmonitor, udevadm
Pokročilé operace ovladačů znakových zařízení
- ioctl
- unlocked ioctl
- compat ioctl
- API uživatelského prostoru
- API jádra
- životní cyklus procesu
- spánek/blokování
- probuzení z režimu spánku
- fronta čekání
- efekt hordy
- poll/select
Ladění jádra
- ladění
-
ladění jádra
- binární vyhledávání pomocí git
- podpora ladění z jádra
- printk syslogd, klogd, úrovně logování, omezení rychlosti, ladící úrovně, výběr laděných subsystémů
- ladění dotováním se na debugfs
- ladění oops, vyvolání oops
- kouzelný klíč SysRq
- kgdb/kdb
- JTAG
Sledování (Tracing)
- gcov
- lcov
- oprofile
-
ftrace
- nop tracer
- function tracer
- sched switch tracer
- function graph tracer
- dynamický tracer
- trace-cmd/kernelshark
- perf
- LTTng
Přerušení
- přerušení vs. polling
- přerušení
- programové sekce
- reenterance
- události
- obslužná rutina přerušení
- sdílená obslužná rutina přerušení
- tok přerušení
- řízení přerušení
Odložení práce
- horní/dolní polovina
- softirqs
- tasklets
- pracovní fronty
- vláknová přerušení
Souběžnost (Concurrency)
- kritická oblast/sekce
- atomické operace
- stav závodní podmínky (race condition)
- synchronizace
- zamykání
- řešení zamykání
- deadlock
- contendování
- co zamknout?
-
co lze použít?
- atomické operace
- spin locks
- čtenář-písař spin locks
- semafor
- binární semafor
- mutex
- čtenář-písař semafor
- proměnné dokončení
- sekvenční zámky
- zakázání přerušení přednostní (preemption)
- pořadí a bariéry
Čas
- HZ
- Jiffies
- velké/malé zpoždění
- časovače jádra
Hardware I/O
- I/O porty
- Paměť I/O
- Jak se vypořádat se vedlejšími účinky přístupu k registrům?
Komunikace Uživatelské prostoru - Jádro
- put(get)_user()
- copy to(from)_user()
- Jádrový I/O
- mapování paměti
- procfs
- sysfs
- debugfs
- relayfs
- netlink
- ioctl
Přenositelnost
- velikost slova
- neprůhledné typy
- signed/unsigned char
- zarovnání dat
- integral promotion
- opětovné použití kódu
- endianita
- systémový tik
- velikost stránky
- pořadí instrukcí
- SMP/preemption/high memory
Kromě tam, kde je uvedeno jinak, jsou obsah a tento osnovy kurzu licencovány pod Atribusi-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0).
United Arab Emirates - Embedded GNU/Linux Kernel Internals and Device Drivers
Qatar - Embedded GNU/Linux Kernel Internals and Device Drivers
Egypt - Embedded GNU/Linux Kernel Internals and Device Drivers
Saudi Arabia - Embedded GNU/Linux Kernel Internals and Device Drivers
South Africa - Embedded GNU/Linux Kernel Internals and Device Drivers
Brasil - Integridade do Kernel GNU/Linux Embarcado e Drivers de Dispositivo
Canada - Embedded GNU/Linux Kernel Internals and Device Drivers
香港 - Embedded GNU/Linux Kernel Internals and Device Drivers
澳門 - Embedded GNU/Linux Kernel Internals and Device Drivers
台灣 - Embedded GNU/Linux Kernel Internals and Device Drivers
USA - Embedded GNU/Linux Kernel Internals and Device Drivers
Österreich - Interne Struktur des GNU/Linux-Kernels und Gerätetreiber
Schweiz - Interne Struktur des GNU/Linux-Kernels und Gerätetreiber
Deutschland - Interne Struktur des GNU/Linux-Kernels und Gerätetreiber
Czech Republic - Interní struktura jádra GNU/Linuxu a ovladače zařízení
Denmark - Embedded GNU/Linux Kernel Internals and Device Drivers
Estonia - Embedded GNU/Linux Kernel Internals and Device Drivers
Finland - Embedded GNU/Linux Kernel Internals and Device Drivers
Greece - Εσώτερο Λειτουργικό των Πυρήνων GNU/Linux και Οδηγοί Συσκευών
Magyarország - Beágyazott GNU/Linux Kernel Belső Működése és Eszközmeghajtók
Ireland - Embedded GNU/Linux Kernel Internals and Device Drivers
Luxembourg - Embedded GNU/Linux Kernel Internals and Device Drivers
Latvia - Embedded GNU/Linux Kernel Internals and Device Drivers
España - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Italia - Interni del kernel GNU/Linux e driver di dispositivo
Lithuania - Embedded GNU/Linux Kernel Internals and Device Drivers
Nederland - Inwendige werking van de GNU/Linux-kernel en apparaatstuurprogramma's
Norway - Inne i Linux-kjernen for innbygde systemer og enhetsdrivere
Portugal - Integridade do Kernel GNU/Linux Embarcado e Drivers de Dispositivo
România - Internele Nucleului GNU/Linux și Driverele de Dispozitive
Sverige - Inbyggd GNU/Linux-kärninterna funktioner och enhetsdrivrutiner
Türkiye - Gömülü GNU/Linux Çekirdek İç Yapıları ve Cihaz Sürücüleri
Malta - Embedded GNU/Linux Kernel Internals and Device Drivers
Belgique - Internalités du noyau GNU/Linux et pilotes de périphériques intégrés
France - Internalités du noyau GNU/Linux et pilotes de périphériques intégrés
日本 - 埋め込み GNU/Linux カーネルの内部構造とデバイスドライバ
Australia - Embedded GNU/Linux Kernel Internals and Device Drivers
Malaysia - Embedded GNU/Linux Kernel Internals and Device Drivers
New Zealand - Embedded GNU/Linux Kernel Internals and Device Drivers
Philippines - Embedded GNU/Linux Kernel Internals and Device Drivers
Singapore - Embedded GNU/Linux Kernel Internals and Device Drivers
Thailand - Embedded GNU/Linux Kernel Internals and Device Drivers
Vietnam - Kiến trúc Nhân GNU/Linux Nhúng và Trình điều khiển Thiết bị
India - Embedded GNU/Linux Kernel Internals and Device Drivers
Argentina - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Chile - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Costa Rica - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Ecuador - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Guatemala - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Colombia - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
México - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Panama - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Peru - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Uruguay - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Venezuela - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Polska - Wewnętrzne mechanizmy jądra GNU/Linux i sterowniki urządzeń
United Kingdom - Embedded GNU/Linux Kernel Internals and Device Drivers
South Korea - 임베디드 GNU/리눅스 커널 내부 구조 및 장치 드라이버
Pakistan - Embedded GNU/Linux Kernel Internals and Device Drivers
Sri Lanka - Embedded GNU/Linux Kernel Internals and Device Drivers
Bulgaria - Вградени вътрешни принципи на ядрото GNU/Linux и драйвери на устройства
Bolivia - Integridades internas del kernel y controladores de dispositivos GNU/Linux integrados
Indonesia - Embedded GNU/Linux Kernel Internals and Device Drivers
Kazakhstan - Embedded GNU/Linux Kernel Internals and Device Drivers
Moldova - Internele Nucleului GNU/Linux și Driverele de Dispozitive
Morocco - Embedded GNU/Linux Kernel Internals and Device Drivers
Tunisia - Embedded GNU/Linux Kernel Internals and Device Drivers
Kuwait - Embedded GNU/Linux Kernel Internals and Device Drivers
Oman - Embedded GNU/Linux Kernel Internals and Device Drivers
Slovakia - Embedded GNU/Linux Kernel Internals and Device Drivers
Kenya - Embedded GNU/Linux Kernel Internals and Device Drivers
Nigeria - Embedded GNU/Linux Kernel Internals and Device Drivers
Botswana - Embedded GNU/Linux Kernel Internals and Device Drivers
Slovenia - Embedded GNU/Linux Kernel Internals and Device Drivers
Croatia - Embedded GNU/Linux Kernel Internals and Device Drivers
Serbia - Embedded GNU/Linux Kernel Internals and Device Drivers
Bhutan - Embedded GNU/Linux Kernel Internals and Device Drivers
Nepal - Embedded GNU/Linux Kernel Internals and Device Drivers
Uzbekistan - Embedded GNU/Linux Kernel Internals and Device Drivers
US Government - Embedded GNU/Linux Kernel Internals and Device Drivers