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).

Sites Published:

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

中国 - 嵌入式GNU/Linux内核与设备驱动

香港 - 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