Свържете се с нас

План на курса

Въведение

  • бърза история на 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).

Изисквания

  • Базово запознаване с използването на система GNU/Linux като крайни потребители
  • Базово запознаване с командна среда (shell)
  • Базови знания за разработка на приложения в потребителско пространство
  • Средно ниво на познания по програмиране в езика C
  • Препоръчително е преди това да сте посетили Вградена архитектура на системите GNU/Linux (силно препоръчително!) и/или да имате добро разбиране на темите, описани там
 35 Часове

Брой участници


Цена за участник

Отзиви от потребители (3)

Предстоящи Курсове

Свързани Kатегории