Upload
alexander-gerasiov
View
73
Download
1
Embed Size (px)
Citation preview
Как перестать бояться ядра Linux и начать писать драйвера
Что такое ядро Linux
● Модули● Загрузка-выгрузка● Внешнее и внутреннее API
Мы хотим писать в ядре
● Высокая ответственность– проверки
– обработка ошибок
● Непонятный control-flow
Модель взаимодействия в ядре
● Отличия от программы– Нет простого «линейного» control-flow
– Асинхронность, множество точек входа
● Объектная модель взаимодействия
ta1_usb
Контексты и точки входа
● init / exit● probe / disconnect● struct *_driver● struct device и driver_data
Инициализация
● Выделение и инициализация struct my_device
● Инициализация устройства
Отключение
● exit / disconnect● занятые устройства● reference counters, krefs
Отложенные вызовы
● callbacks● hrtimer● kthread
user_ops (file_operations)
● Регистрация интерфейса с user-space
Подсистема
● Выделяет общую для класса драйверов функциональность
● Как минимум интерфейс с user-space
Виртуальное устройство
● Регистрируется в подсистеме● Эмулирует работу аппаратуры
Гонки и блокировки
● Контексты● spinlock● mutex● completions● wait_event / wake_up● Нельзя оставлять блокировки на «потом»
Lock-free алгоритмы
● atomic_t● test_and_set● seqlock● RCU
Структуры данных
● struct device● driver_data● container_of● списки● kref● alloc / commit
Взаимодействие с пользователем
● *_ops● file_operation● ioctl● copy_from/to_user● mmap
Как устроена аппаратура
● Процессор– Прошивка для FPGA
● Память● Шины
– Внешняя
– Внутренняя
● Мост / контроллер внешней шины● Интерфейс на внешней шине «Регистровая модель»● Прерывания
Взаимодействие с аппаратурой
● i/o ports● memory mapped IO● dma● кэширование и буферизация● irq● usb
Память и адресация в ядре
● user virtual● kernel virtual● physical● bus
Отладка
● printk()● BUG(), BUG_ON()● Чтение dump'ов● Serial
– тайминги
● Виртуализация● Есть еще хитрое кунг фу
Coding style
● conventions● checkpatch.pl
Как со всем этим жить?
● LDD– Неплохо структурирован
– «Вводная информация»
– Много воды
– Стремительно устаревает
– Далеко не все подсистемы описаны
Read the source, Luke
– cscope/ctags
– Linux Cross Reference
Всем спасибо, приходите еще