Course Code: ldd
Duration: 35 hours
Prerequisites:
- Базово запознаване с използването на система GNU/Linux като крайни потребители
- Базово запознаване с командна среда (shell)
- Базови знания за разработка на приложения в потребителско пространство
- Средно ниво на познания по програмиране в езика C
- Препоръчително е преди това да сте посетили Вградена архитектура на системите GNU/Linux (силно препоръчително!) и/или да имате добро разбиране на темите, описани там
Overview:
Описание
Този 5-дневен обучителен курс използва практически упражнения в комбинация с теоретични материали, за да илюстрира концепциите за вътрешни принципи на ядрото GNU/Linux и разработката на драйвери на устройства. Курсът е създаден с цел да ви позволи бързо да усвоите материята. Описваме процесите, концепциите и командите, необходими за писането на драйвери на устройства в GNU/Linux, чрез комбинация от теория и практически опит.
Не измисляйте отново колелото, а се възползвайте от опита на обучител с дългогодишен стаж и си загрейте с практически знания и умеейки да ги прилагате ефективно във вашия собствен проект за вградена разработка.
За кого е предназначен курсът?
За лица с интерес или задължение за развитие или оценка на драйвери на устройства в GNU/Linux, като например софтуерни инженери, полеви инженери, (проектни) мениджъри, хардуерни инженери.
Course Outline:
Въведение
- бърза история на GNU/Linux
- лицензиране
- версиониране на ядрото
- цикъл на излизане на нови версии
- дървета на ядрото (kernel trees)
- основни версии (mainline)
- ядро срещу потребителско пространство
- механизъм срещу политика
- алтернативи на драйвери в ядрото
- RTOS срещу Linux
Управление на паметта
- виртуална памет срещу физическа памет
- разпределение на паметта в ядрото
- страници
- зони
- API
- slab
Пачове на ядрото (Kernel Patches)
- жизнен цикъл
- git
- изходен код на ядрото
- създаване на пач (patch)
- проверка на пач (check patch)
- корекция на пач (fix patch)
- изпращане на пач (ship patch)
- одитиран код
Модули на ядрото (Kernel Modules)
- получаване на изходен код на ядрото
- конфигуриране/изграждане/инсталиране
- драйвери на устройства (статично свързани, зареждани във времето на изпълнение)
- init/exit
- лицензиране
- EXPORT SYMBOL GPL
- Makefile извън дървото на ядрото
- module-init-tools
- модул в дървото на ядрото
- Kconfig
- предаване на параметри
- sparse
Драйвери за характерни устройства (Char Drivers)
- архитектура
- интерфейс потребител/ядро
- подсистема I/O
- VFS
- sysfs (устройства, магистрални устройства, драйвери, класове),
- kobject/ktype/kset
- модел на драйверите на ядрото на Linux
- файлове на устройства
-
драйвер за характерни устройства
- инициализация
- регистрация
- отваряне, затваряне
- cdev, добавяне на cdev, изтриване на cdev,...
- главни/вторични номера
- udev, udevmonitor, udevadm
Разширени операции за драйвери на характерни устройства
- ioctl
- неблокиращ ioctl (unlocked ioctl)
- совместим ioctl (compat ioctl)
- API за потребителско пространство
- API за ядро пространство
- жизнен цикъл на процеса
- спиране/блокиране
- спиране/събуждане
- опашка за чакащи (wait queue)
- тълпата (thundering herd)
- poll/select
Отстраняване на грешки в ядрото (Kernel Debugging)
- дебъгване (debugging)
-
дебъгване на ядрото
- двоичен търсач с git
- поддръжка за дебъгване от ядрото
- printk syslogd, klogd, нива на лог, ограничаване на честотата, нива на дебъгване, избор на подсистеми за дебъгване
- дебъгване чрез запитване на debugfs
- дебъгване на oops, форсиране на oops
- Magic SysRq Key
- kgdb/kdb
- JTAG
Проследяване (Tracing)
- gcov
- lcov
- oprofile
-
ftrace
- nop tracer
- function tracer
- sched switch tracer
- function graph tracer
- dynamic tracer
- trace-cmd/kernelshark
- perf
- LTTng
Преки (Interrupts)
- преки срещу полиране (polling)
- преки
- секции на кода
- вносимост (reentrancy)
- събития
- обработчик на преки (interrupt handler)
- споделен обработчик на преки
- поток на преки
- контрол на преки
Отложено изпълнение (Deferring Work)
- горни/долни половини (top/bottom halves)
- софт прекъсвания (softirqs)
- tasklets
- опашки за задачи (work queues)
- преки на нишки (threaded interrupts)
Паралелизъм (Concurrency)
- критична област/секция
- атомарни операции
- състезание на данни (race condition)
- синхронизация
- заключване (locking)
- решения за заключване
- мъртво заключване (deadlock)
- състезание за ресурси (contention)
- какво да заключим?
-
какво може да се използва?
- атомарни операции
- спинове замкове (spin locks)
- спинове замкове за четене/запис (reader-writer spin locks)
- семафор
- двоен семафор (binary semaphore)
- мутекс (mutex)
- семафор за четене/запис (reader-writer semaphore)
- променливи за завършване (completion variables)
- поредни замкове (sequential locks)
- деактивиране на превключване (disable preemption)
- поредност и бариери (ordering and barriers)
Време
- HZ
- Jiffies
- големи/малки забавяния
- таймери на ядрото
Апаратен I/O
- I/O Портове
- I/O Памет
- Как да работим със странични ефекти при достъп до регистри?
комуникация между потребител и ядро
- put(get)_user()
- копиране към(от)_user()
- ядро I/O
- мапиране на паметта
- procfs
- sysfs
- debugfs
- relayfs
- netlink
- ioctl
Преносимост
- размер на думата
- непрозрачни типове (opaque types)
- знак/беззнаков char
- подравняване на данните
- цяло число за промоция
- повторна употреба на код
- крайност (endianess)
- тикет на системата
- размер на страницата
- подредба на инструкции
- SMP/превключване/висока памет
Освен където е отбелязано иначе, съдържанието и тази учебна програма са лицензирани под Attribution-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