Драйверы устройств для linux 3 е издание

Драйверы Устройств Linux, Третья Редакция

Linux Device Drivers, Third Edition

by Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman

Авторское право © 2005, 2001, 1998 O’Reilly Media, Inc. Все права защищены.

Напечатано в Соединённых Штатах Америки.

Опубликовано O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472.

Книги O’Reilly можно приобрести для образования, бизнеса или продажи в рекламных целях. Для большинства книг также доступны Интернет издания (safari.oreilly.com). Для получения дополнительной информации свяжитесь с нашим корпоративным/институциональным отделом продаж: (800) 998-9938 или corporate@oreilly.com.

Редактор : Andy Oram

Производственный редактор : Matt Hutchinson

Услуги по производству : Octal Publishing, Inc.

Разработка обложки : Edie Freedman

Разработка внутреннего оформления : Melanie Wang

Февраль 1998: Первая редакция.

Июнь 2001: Вторая редакция.

Февраль 2005: Третья редакция.

Nutshell Handbook, логотип Nutshell Handbook и логотип O’Reilly являются зарегистрированными торговыми марками компании O’Reilly Media, Inc. Обозначения серий о Linux, Linux Device Drivers, образы американского запада и соответствующее оформление книги являются товарными знаками компании O’Reilly Media, Inc.

Многие из обозначений, используемых производителями и продавцами для обозначения своих продуктов, заявляются в качестве торговых марок. Если такие обозначения появляются в этой книге и O’Reilly Media, Inc. было известно о торговой марке, такие обозначения напечатаны в верхнем регистре или с заглавной буквы.

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

Источник

Linux Device Drivers, Third Edition

This book is available under the terms of the Creative Commons Attribution-ShareAlike 2.0 license. That means that you are free to download and redistribute it. The development of the book was made possible, however, by those who purchase a copy from O’Reilly or elsewhere.

LDD3 is current as of the 2.6.10 kernel. See the LWN 2.6 API changes page for information on subsequent changes.

LDD3 chapter files

Title page PDF
Copyright and credits PDF
Table of Contents PDF
Preface PDF
Chapter 1: An Introduction to Device Drivers PDF
Chapter 2: Building and Running Modules PDF
Chapter 3: Char Drivers PDF
Chapter 4: Debugging Techniques PDF
Chapter 5: Concurrency and Race Conditions PDF
Chapter 6: Advanced Char Driver Operations PDF
Chapter 7: Time, Delays, and Deferred Work PDF
Chapter 8: Allocating Memory PDF
Chapter 9: Communicating with Hardware PDF
Chapter 10: Interrupt Handling PDF
Chapter 11: Data Types in the Kernel PDF
Chapter 12: PCI Drivers PDF
Chapter 13: USB Drivers PDF
Chapter 14: The Linux Device Model PDF
Chapter 15: Memory Mapping and DMA PDF
Chapter 16: Block Drivers PDF
Chapter 17: Network Drivers PDF
Chapter 18: TTY Drivers PDF
Index PDF

Downloads

Copyright © 2021, Eklektix, Inc.
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds

Источник

Драйверы устройств для Linux, 3-е издание

Год публикации: 2005
Авторы: Джонатан Корбет, Александро Рубини, Грег Кроах-Хартман
Издательство: ORelly
Лицензия: Creative Commons Attribution-NonCommercialShareAlike
2.0
Язык: русский
Страниц: 567
ISBN: 0-596-00590-3

В отличие от других операционных систем, ядро Linux полностью доступно для анализа, и даже изменения. Книга Linux Device Drivers, Third Edition вышла еще в 2005 году, но все еще содержит актуальную и полезную информацию для разработчиков, которые хотят программировать драйверы ядра. Здесь рассмотрены базовые концепции разработки драйверов, роль драйверов, создание различных типов драйверов, как для символьных так и для блочных устройств. В книге освещены все новые возможности, которые появились в версии ядра 2.6. Эти возможности позволили улучшить производительность ядра, а также упростили код и сделали создание драйверов намного легче.

Книга «Драйверы устройств для Linux 3-е издание» распространяется под лицензией Creative Commons Attribution-NonCommercialShareAlike
2.0, а это значит что вы можете ее бесплатно скачивать и распространять. Доработка книги тоже возможна, но только для тех, кто купил копию в ORelly.

Источник

Как написать свой первый Linux device driver

Здравствуйте, дорогие хабрачитатели.

Цель данной статьи — показать принцип реализации драйверов устройств в системе Linux, на примере простого символьного драйвера.

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

Это моя первая статья, пожалуйста не судите строго!

Получилось слишком много букв, поэтому я принял решение разделить статью на три части:

Часть 1 — Введение, инициализация и очистка модуля ядра.
Часть 2 — Функции open, read, write и trim.
Часть 3 — Пишем Makefile и тестируем устройство.

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

Подготовительные работы

Спасибо Kolyuchkin за уточнения.

Символьный драйвер (Char driver) — это, драйвер, который работает с символьными устройствами.
Символьные устройства — это устройства, к которым можно обращаться как к потоку байтов.
Пример символьного устройства — /dev/ttyS0, /dev/tty1.

К вопросу про проверсию ядра:

Драйвер представляет каждое символьное устройство структурой scull_dev, а также предостовляет интерфейс cdev к ядру.

Устройство будет представлять связный список указателей, каждый из которых указывает на структуру scull_qset.

Для наглядности посмотрите на картинку.

Для регистрации устройства, нужно задать специальные номера, а именно:

MAJOR — старший номер (является уникальным в системе).
MINOR — младший номер (не является уникальным в системе).

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

После того как мы определили номера для нашего устройства, мы должны установить связь между этими номерами и операциями драйвера. Это можно сделать используя структуру file_operations.

В ядре есть специальные макросы module_init/module_exit, которые указывают путь к функциям инициализации/удаления модуля. Без этих определений функции инициализации/удаления никогда не будут вызваны.

Здесь будем хранить базовую информацию об устройстве.

Последним этапом подготовительной работы будет подключение заголовочных файлов.
Краткое описание приведено ниже, но если вы хотите копнуть поглубже, то добро пожаловать на прекрасный сайт: lxr

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

Теперь давайте посмотрим на функцию инициализации устройства.

Первым делом, вызывая alloc_chrdev_region мы регистрируем диапазон символьных номеров устройств и указываем имя устройства. После вызовом MAJOR(dev) мы получаем старший номер.
Далее проверяется вернувшееся значение, если оно является кодом ошибки, то выходим из функции. Стоит отметить, что при разработке реального драйвера устройства следует всегда проверять возвращаемые значения, а также указатели на любые элементы (NULL?).

Если вернувшееся значение не является кодом ошибки, продолжаем выполнять инициализацию.

Выделяем память, делая вызов функции kmalloc и обязательно проверяем указатель на NULL.

Стоит упомянуть, что вместо вызова двух функций kmalloc и memset, можно использовать один вызов kzalloc, который выделят область памяти и инициализирует ее нулями.

Продолжаем инициализацию. Главная здесь функция — это scull_setup_cdev, о ней мы поговорим чуть ниже. MKDEV служит для хранения старший и младших номеров устройств.

Возвращаем значение или обрабатываем ошибку и удаляем устройство.

Выше были представлены структуры scull_dev и cdev, которые реализуют интерфейс между нашим устройством и ядром. Функция scull_setup_cdev выполняет инициализацию и добавление структуры в систему.

Удаление

Функция scull_cleanup_module вызывается при удалении модуля устройства из ядра.
Обратный процесс инициализации, удаляем структуры устройств, освобождаем память и удаляем выделенные ядром младшие и старшие номера.

С удовольствием выслушаю конструктивную критику и буду ждать feedback’a.

Если вы нашли ошибки или я не правильно изложил материал, пожалуйста, укажите мне на это.
Для более быстрой реакции пишите в ЛС.

Источник

Как написать свой первый Linux device driver

Здравствуйте, дорогие хабрачитатели.

Цель данной статьи — показать принцип реализации драйверов устройств в системе Linux, на примере простого символьного драйвера.

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

Это моя первая статья, пожалуйста не судите строго!

Получилось слишком много букв, поэтому я принял решение разделить статью на три части:

Часть 1 — Введение, инициализация и очистка модуля ядра.
Часть 2 — Функции open, read, write и trim.
Часть 3 — Пишем Makefile и тестируем устройство.

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

Подготовительные работы

Спасибо Kolyuchkin за уточнения.

Символьный драйвер (Char driver) — это, драйвер, который работает с символьными устройствами.
Символьные устройства — это устройства, к которым можно обращаться как к потоку байтов.
Пример символьного устройства — /dev/ttyS0, /dev/tty1.

К вопросу про проверсию ядра:

Драйвер представляет каждое символьное устройство структурой scull_dev, а также предостовляет интерфейс cdev к ядру.

Устройство будет представлять связный список указателей, каждый из которых указывает на структуру scull_qset.

Для наглядности посмотрите на картинку.

Для регистрации устройства, нужно задать специальные номера, а именно:

MAJOR — старший номер (является уникальным в системе).
MINOR — младший номер (не является уникальным в системе).

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

После того как мы определили номера для нашего устройства, мы должны установить связь между этими номерами и операциями драйвера. Это можно сделать используя структуру file_operations.

В ядре есть специальные макросы module_init/module_exit, которые указывают путь к функциям инициализации/удаления модуля. Без этих определений функции инициализации/удаления никогда не будут вызваны.

Здесь будем хранить базовую информацию об устройстве.

Последним этапом подготовительной работы будет подключение заголовочных файлов.
Краткое описание приведено ниже, но если вы хотите копнуть поглубже, то добро пожаловать на прекрасный сайт: lxr

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

Теперь давайте посмотрим на функцию инициализации устройства.

Первым делом, вызывая alloc_chrdev_region мы регистрируем диапазон символьных номеров устройств и указываем имя устройства. После вызовом MAJOR(dev) мы получаем старший номер.
Далее проверяется вернувшееся значение, если оно является кодом ошибки, то выходим из функции. Стоит отметить, что при разработке реального драйвера устройства следует всегда проверять возвращаемые значения, а также указатели на любые элементы (NULL?).

Если вернувшееся значение не является кодом ошибки, продолжаем выполнять инициализацию.

Выделяем память, делая вызов функции kmalloc и обязательно проверяем указатель на NULL.

Стоит упомянуть, что вместо вызова двух функций kmalloc и memset, можно использовать один вызов kzalloc, который выделят область памяти и инициализирует ее нулями.

Продолжаем инициализацию. Главная здесь функция — это scull_setup_cdev, о ней мы поговорим чуть ниже. MKDEV служит для хранения старший и младших номеров устройств.

Возвращаем значение или обрабатываем ошибку и удаляем устройство.

Выше были представлены структуры scull_dev и cdev, которые реализуют интерфейс между нашим устройством и ядром. Функция scull_setup_cdev выполняет инициализацию и добавление структуры в систему.

Удаление

Функция scull_cleanup_module вызывается при удалении модуля устройства из ядра.
Обратный процесс инициализации, удаляем структуры устройств, освобождаем память и удаляем выделенные ядром младшие и старшие номера.

С удовольствием выслушаю конструктивную критику и буду ждать feedback’a.

Если вы нашли ошибки или я не правильно изложил материал, пожалуйста, укажите мне на это.
Для более быстрой реакции пишите в ЛС.

Источник

Читайте также:  Вас приветствует windows 10
Оцените статью