linux drivers

25
Как перестать бояться ядра Linux и начать писать драйвера

Upload: alexander-gerasiov

Post on 17-Jul-2015

78 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Linux drivers

Как перестать бояться ядра Linux и начать писать драйвера

Page 2: Linux drivers

Что такое ядро Linux

● Модули● Загрузка-выгрузка● Внешнее и внутреннее API

Page 3: Linux drivers

Мы хотим писать в ядре

● Высокая ответственность– проверки

– обработка ошибок

● Непонятный control-flow

Page 4: Linux drivers

Модель взаимодействия в ядре

● Отличия от программы– Нет простого «линейного» control-flow

– Асинхронность, множество точек входа

● Объектная модель взаимодействия

Page 5: Linux drivers

ta1_usb

Page 6: Linux drivers

Контексты и точки входа

● init / exit● probe / disconnect● struct *_driver● struct device и driver_data

Page 7: Linux drivers

Инициализация

● Выделение и инициализация struct my_device

● Инициализация устройства

Page 8: Linux drivers

Отключение

● exit / disconnect● занятые устройства● reference counters, krefs

Page 9: Linux drivers

Отложенные вызовы

● callbacks● hrtimer● kthread

Page 10: Linux drivers

user_ops (file_operations)

● Регистрация интерфейса с user-space

Page 11: Linux drivers

Подсистема

● Выделяет общую для класса драйверов функциональность

● Как минимум интерфейс с user-space

Page 12: Linux drivers

Виртуальное устройство

● Регистрируется в подсистеме● Эмулирует работу аппаратуры

Page 13: Linux drivers

Гонки и блокировки

● Контексты● spinlock● mutex● completions● wait_event / wake_up● Нельзя оставлять блокировки на «потом»

Page 14: Linux drivers

Lock-free алгоритмы

● atomic_t● test_and_set● seqlock● RCU

Page 15: Linux drivers

Структуры данных

● struct device● driver_data● container_of● списки● kref● alloc / commit

Page 16: Linux drivers

Взаимодействие с пользователем

● *_ops● file_operation● ioctl● copy_from/to_user● mmap

Page 17: Linux drivers

Как устроена аппаратура

● Процессор– Прошивка для FPGA

● Память● Шины

– Внешняя

– Внутренняя

● Мост / контроллер внешней шины● Интерфейс на внешней шине «Регистровая модель»● Прерывания

Page 18: Linux drivers

Взаимодействие с аппаратурой

● i/o ports● memory mapped IO● dma● кэширование и буферизация● irq● usb

Page 19: Linux drivers

Память и адресация в ядре

● user virtual● kernel virtual● physical● bus

Page 20: Linux drivers

Отладка

● printk()● BUG(), BUG_ON()● Чтение dump'ов● Serial

– тайминги

● Виртуализация● Есть еще хитрое кунг фу

Page 21: Linux drivers

Coding style

● conventions● checkpatch.pl

Page 22: Linux drivers

Как со всем этим жить?

● LDD– Неплохо структурирован

– «Вводная информация»

– Много воды

– Стремительно устаревает

– Далеко не все подсистемы описаны

Page 23: Linux drivers
Page 24: Linux drivers

Read the source, Luke

– cscope/ctags

– Linux Cross Reference

Page 25: Linux drivers

Всем спасибо, приходите еще