linux drivers

Post on 17-Jul-2015

78 Views

Category:

Software

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Как перестать бояться ядра 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

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

top related