Разработка драйвера устройств Linux

Джон Мадьё

 

Первая публикация на английском языке: Октябрь 2017

Ссылка на продукт:

Все права защищены. Никакая часть этой книги не может быть воспроизведена, сохранена в поисковой системе или передана в любой форме или любыми средствами без предварительного письменного разрешения издателя, за исключением случаев кратких цитат, встроенных в критические статьи и обзоры.

При подготовке этой книги были предприняты все усилия чтобы гарантировать точность представленной информации. Тем не менее, информация, содержащаяся в этой книге, продаётся без гарантии в явном или неявном виде. Ни авторы, ни Packt Publishing, ни их дилеры и дистрибьюторы не будут нести ответственность за любые убытки, вызванные или предположительно вызванные прямо или косвенно этой книгой.

Packt Publishing пыталась предоставить информацию о товарных знаках обо всех компаниях и продуктов, упомянутых в данной книге для надлежащего использования капиталов. Тем не менее, Packt Publishing не может гарантировать точность этой информации.

Опубликовано Packt Publishing Ltd.

Livery Place

35 Livery Street

Birmingham B3 2PB, UK

ISBN-13 9781785280009

www.packtpub.com

2017-10-28

 Состав исполнителей

Автор
Джон Мадьё
Рецензент
Редактор выпуска
Мита Раджани
Редактор разработки содержания
Абхишек Джадхав
Технический редактор
Маниш Д. Шанбханг
Литературный редактор
Safis Editing
Джулиана Нейр
Координатор проекта
Джуди Хосе
Корректор
Safis Editing
Составитель указателя
Теджал Сони Дарувала
Координатор производства
Апарна Бхагат
Графика
Кирк Д'Пенья
Вайбхав Бхембре
Энтони Д'Атри
Сьюзан Д'Атри

 Об авторе

Джон Мадьё

 Рецензент

 www.PacktPub.com

 Содержание

Предисловие
Что охватывает эта книга
Что вам нужно для этой книги
Для кого эта книга
Соглашения
Обратная связь с читателями
Поддержка пользователей
Загрузка кодов примеров
Загрузка цветных изображений данной книги
Опечатки
Незаконное тиражирование
Вопросы
Глава 1. Введение в разработку ядра
Установка среды
Предпочтения ядра
Выводы
Глава 2. Основы драйверов устройств
Пространство пользователя и пространство ядра
Скелет драйвера
Выдача сообщений и ошибок
Параметры модуля
Построение вашего первого модуля
Выводы
Глава 3. Возможности ядра и вспомогательные функции
Понимание макроса container_of
Списки linked
Механизм спящего режима ядра
Управление задержкой и таймером
Механизм захвата ядра
Механизм задержек ядра
Механизм прерываний ядра
Потоковые IRQ
Вызов приложений пространства пользователя из ядра
Выводы
Глава 4. Символьные драйверы устройств
Концепция основных и второстепенных
Введение в файловые операции устройств
Операции файловой записи
Выводы
Глава 5. Драйверы устройств платформы
Драйверы платформы
Драйверы устройств
Устройства, драйверы и соответствие шине
Выводы
Глава 6. Концепция дерева устройств
Механизм дерева устройств
Представление и адресация устройств
Обработка ресурсов
Драйверы платформы и DT
Выводы
Глава 7. Драйверы I2C клиента
Архитектура драйвера
Доступ клиента
I2C и строение дерева клиента
Выводы
Глава 8. Драйверы устройств SPI
Архитектура драйвера
Доступ к клиенту и общение с ним
Собираем всё воедино
Драйвер SPI режима пользователя
Выводы
Глава 9. API Regmap: Абстракция соответствия реестра
Программирование API regmap
Выводы
Глава 10. Инфраструктура IIO
Структура данных IIO
Поддержка переключаемого буфера
Доступ к данным IIO
Инструменты IIO
Выводы
Глава 11. Управление памятью ядра
Схема памяти системы - пространство ядра и пространство пользователя
Адресация ядра - понятие нижних и верхних адресов памяти
Нижние адреса памяти
Верхние адреса памяти
Адреса пространства пользователя
Область виртуальной памяти (VMA)
Трансляция адресов и MMU
Поиск страниц и TLB
Как работает TLB
Механизм выделения памяти
Блок выделения страниц
API блока выделения страниц
Функции преобразования
Распределение slab
Алгоритм распределения buddy
Прогулка по распределению slab
Семейство выделения памяти kmalloc
Распределение vmalloc
Под капотом процесса выделения памяти
Вариант копирования записью (CoW)
Работа с вводом/ выводом памяти для взаимодействия с оборудованием
Доступ к устройствам PIO
Доступ к устройствам MMIO
Куки __iomem
Назначение (переназначение) памяти
kmap
Установка соответствия памяти ядра пространству пользователя
Применение remap_pfn_range
Применение io_remap_pfn_range
Файловые операции mmap
Реализация mmap в самом ядре
Система кэширования Linux
Что такое кэш?
Кэш ЦПУ - кэширование памяти
Кэширование страниц Linux - кэш диска
Специализированное кэширование (кэширование пространства пользователя)
Зачем откладывать запись данных на диск?
Стратегии кэширования записи
Потоки сброса
Управление ресурсами устройств - Devres
Выводы
Глава 12. DMA: прямой доступ к памяти
Установка соответствия DMA
Концепция завершения
Механизм API DMA
Совмещаем всё вместе
NXP SDMA (i.MX6)
Связывание DT DMA
Выводы
Глава 13. Модель устройства Linux
Структура данных LDM
Погружаемся вглубь LDM
Модель устройства и sysfs
Выводы
Глава 14. Управление контактами и подсистема GPIO
Подсистема управления контактами
Подсистема GPIO
Выводы
Глава 15. Драйверы контроллера GPIO
Архитектура драйвера и структуры данных
Руководство контроллера контактов
Интерфейс sysfs для контроллера GPIO
Контроллеры GPIO и DT
Выводы
Глава 16. Расширенное управление IRQ
Мультиплексирование прерываний и контроллеров прерываний
Расширенное управление периферийными IRQ
Запрос на прерывание и его распространение
Выводы
Глава 17. Драйверы устройств ввода
Размещение и регистрация драйвера ввода
Генерация события ввода и сообщение о нём
Интерфейс пространства пользователя
Собираем всё воедино
Выводы
Глава 18. Драйверы RTC
Общая схема структуры данных RTC
RTC и пространство пользователя
Выводы
Глава 19. Драйверы PWM
Драйвер контроллера PWM
Интерфейс потребителя PWM
Применение PWM с интерфейсом sysfs
Выводы
Глава 20. Структура механизма регуляции
Интерфейс драйвера PMIC/ производитель
Интерфейс потребителя механизма регуляции
Связывание механизма регуляции
Выводы
Глава 21. Драйверы framebuffer
Структура данных драйвера
Методы устройства
Методы драйвера
Framebuffer из пользовательского пространства
Выводы
Глава 22. Драйверы карты сетевого устройства
Структура данных драйвера
Структура буфера сокета
Выделение буфера сокета
Структура сетевого интерфейса
Методы устройства
Открытие и закрытие
Обработка пакета
Приём пакета
Передача пакета
Пример драйвера
Состояние и управление
Обработчик прерывания
Поддержка Ethtool
Методы драйвера
Функция probe
Выгрузка модуля
Выводы
Приложение A - Срывая мистику с графики Linux
Консоль и буфер кадра
Давным давно...
Устройства кадрового буфера
Система X Window
Система X Window
Клиенты и серверы X
X расширения
2D ускорение в X
OpenGL, Mesa и Gallium3D
OpenGL
Сопоставление косвенного и прямого построения изображения
Mesa
Gallium3D
Стек драйвера OpenGL
Open СL
DRI – Direct Rendering Infrastructure
DRI & DRM
Версии DRI
Хозяин DRI и узлы псотроения изображения
Управление памятью и совместное использование буфера
KMS – Kernel Mode Setting
Проблемы с установками режима пользователя
Установки режима ядра
Обзор KMS
Составная операция
Составная операция
Составная операция и OpenGL
Xgl
AIGLX
Обзор драйвера
Драйверы для графического оборудования PC
Обычный стек драйвера в PC
Драйверы для встроенных GPU
Прочие графические системы - Android, Wayland и Mir
Что ещё кроме этого?
Android
Wayland
XWayland и Hybris
Mir
Ускорение видео
Ускорение видео
Аппаратное декодирование
Гибридная графика
Гибридная графика
Bumblebee и PRIME
Приложение B - Диспетчер прямого построения изображений
Обзор
Архитектура программного обеспечения
API
DRM-Master и DRM-Auth
Graphics Execution Manager
Translation Table Maps
Совместное использование буфера DMA и PRIME
Kernel Mode Setting
Модель устройства KMS
Атомарный дисплей
Узлы построения изображения
Аппаратная поддержка
Указатель

 Предисловие

 Что охватывает эта книга

Глава 1. Введение в разработку ядра,

Глава 2. Основы драйверов устройств,

Глава 3. Возможности ядра и вспомогательные функции,

Глава 4. Символьные драйверы устройств

Глава 5. Драйверы устройств платформы

Глава 6. Концепция дерева устройств

Глава 7. Драйверы I2C клиента

Глава 8. Драйверы устройств SPI

Глава 9. API Regmap: Абстракция соответствия реестра

Глава 10. Инфраструктура IIO

Глава 11. Управление памятью ядра

Глава 12. DMA: прямой доступ к памяти

Глава 13. Модель устройства Linux

Глава 14. Управление контактами и подсистема GPIO

Глава 15. Драйверы контроллера GPIO

Глава 16. Расширенное управление IRQ

Глава 17. Драйверы устройств ввода

Глава 18. Драйверы RTC

Глава 19. Драйверы PWM

Глава 20. Структура механизма регуляции

Глава 21. Драйверы framebuffer

Глава 22. Драйверы карты сетевого устройства

 Что вам нужно для этой книги

 Для кого эта книга

 Соглашения

В данной книге вы найдёте ряд текстовых стилей, которые делают разницу между различными видами информации. Здесь мы приводим некоторые примеры этих стилей и объяснение их назначения.

Кодовые слова в тексте, имена таблиц базы данных, имена папок, имена файлов, расширения файлов, имена путей, модели URL-адресов, ввод пользователя, и регулировки Twitter представлены следующим образом: "Создайте некоего нового пользователя для JIRA в этой базе данных и предоставьте права доступа для базы данных jiradb, которую мы только что создали применив следующую команду:..."

Блок кода записываются следующим образом:


glance-api.conf:
[glance_store]
 stores = rbd
 default_store = rbd
 rbd_store_pool = images
 rbd_store_user = glance-user
 rbd_store_ceph_conf = /etc/ceph/ceph.conf
 rbd_store_chunk_size = 8
	   

Любой ввод и вывод командной строки записываются так:


instance$ ls /dev/vd*
/dev/vda /dev/vda1 /dev/vdb
instance$ lsblk
       

Новые термины и важные слова отображаются жирным шрифтом.

[Замечание]Замечание

Предостережения или важные замечания появляются в блоках подобных этому.

[Предостережение]Предостережение

.

[Совет]Совет

Советы и ловкие приёмы возникают таким образом.

 Обратная связь с читателями

Обращения наших читателей всегда приветствуются. Дайте нам знать что вы думаете об этой книге - что вам нравится или не нравится. Обратная связь с читателями важна нам, так как помогает нам разрабатывать издания, от которых вы на самом деле получите максимальную пользу.

Для отправки обычного отклика просто пошлите электронное письмо на адрес feedback@packtpub.com с упоминанием заголовка книги в теме вашего сообщения.

Если у вас существует тема, в которой у вас имеется опыт и вы заинтересованы либо в написании, либо во вкладе в книгу, обратитесь к руководству по адресу www.packtpub.com/authors.

 Поддержка пользователей

Теперь, когда вы являетесь гордым владельцем книги Packt, у нас есть целый ряд моментов для помощи вам в получении максимальной выгоды от вашей покупки.

 Загрузка примеров кода

Вы можете загрузить файлы примеров кода по адресу из своей учётной записи: http://www.packtpub.com. Если вы приобрели книгу где- либо ещё, вы можете посетить http://www.packtpub.com/support и зарегистрироваться для получения этих файлов по электронной почте непосредственно на свой адрес.

Вы можете загрузить эти файлы с кодом выполнив следующие шаги:

  1. Зарегистрируйтесь на нашем вебсайте при помощи своего адреса электронной почты и пароля.

  2. Переместите указатель мыши на закладку SUPPORT в верхней части.

  3. Кликните по Code Downloads & Errata.

  4. Введите название книги в блок Search.

  5. Выберите книгу для которой вы ищете для загрузки файлы исходного кода.

  6. В ниспадающем меню выберите где вы приобрели эту книгу.

  7. Кликните по Code Download.

Вы также можете загрузить фалы кодов кликнув по кнопке Code Files вебстраницы на вебсайте Packt Publishing. Доступ к данной странице может быть получен путём ввода названия книги в блоке Search. Отметим, что вы должны быть зарегистрированы со своеЙ учётной записью Packt.

После загрузки убедитесь, пожалуйста, что вы раззиповали или раскрыли эту папку при помощи самой последней версии:

  1. WinRAR / 7-Zip для Windows

  2. Zipeg / iZip / UnRarX для Mac

  3. 7-Zip / PeaZip для Linux

Пакет с кодом для данной книги также размещён на GitHub по адресу https://github.com/PacktPublishing/Linux-Device-Drivers-Development. У нас также имеются прочие наборы из нашего богатого каталога книг и видео доступные на https://github.com/PacktPublishing/. Следите за ними!

 Загрузка цветных изображений данной книги

Также мы снабжаем вас неким PDF файлом, который имеет цветные изображения применяемых в данной книге снимков экрана/ схем. Эти цветные изображения помогут вам лучше понять все изменения в имеющемся выводе. Вы можете загрузить этот файл с https://www.packtpub.com/sites/default/files/downloads/LinuxDeviceDriversDevelopment_ColorImages.pdf.

 Опечатки

Хотя мы и предприняли все меры чтобы обеспечить точность нашего содержимого, ошибки всё- таки возможны. Если вы обнаружили ошибку в нашей книге - возможно, ошибку в тексте или в коде - мы будем признательны если вы сообщите об этом нам. Сделав это, вы можете предостеречь остальных читателей от разочарования и помочь нам улучшить последующие версии данной книги. Если вы обнаружили ошибку, пожалуйста, сообщите о ней посетив www.packtpub.com/submit-errata, выбрав вашу книгу, кликнув на ссылку Errata Submission Form, и заполнив подробности найденной вами ошибки. Когда ваша ошибка будет проверена, вы получите уведомление и ошибка будет выложена на наш веб- сайт или добавлена в какой- нибудь перечень существующих ошибок с заголовком раздела Errata.

Для просмотра ранее выявленных ошибок посетите www.packtpub.com/books/content/support и введите название нужной книги в поле поиска. Необходимая информация появится в разделе Errata.

 Незаконное тиражирование

Пиратство, защищённых авторским правом материалов в Интернете является постоянной проблемой во всех средствах массовой информации. В Packt мы подходим к защите наших авторских прав и лицензий очень серьёзно. Если вы столкнётесь с какой-либо незаконной копией наших работ в любой форме в Интернете, пожалуйста, предоставьте нам сразу адрес местонахождения или имя веб-сайта, чтобы мы могли принять меры. {Прим. пер.: Согласно закону об авторском праве РФ, авторские права на перевод принадлежат авторам этого перевода. Данным переводом, по нашему мнению, мы служим популяризации основных стратегических направлений развития тем Packt. В случае наличия конструктивных предложений, готовы к тесному сотрудничеству.}

Пожалуйста, обратитесь по адресу copyright@packtpub.com со ссылкой на материалы содержащие признаки нарушения авторских прав.

Мы выражаем вам признательность в защите наших авторов и нашей возможности доносить до вас имеющего ценность содержимого.

 Вопросы

Если у вас есть проблемы по любым сторонам данной книги, вы можете контактировать с нами по адресу questions@packtpub.com и мы предпримем все меры в отношении ваших проблем.