Меню Рубрики

Linux device drivers на русском

Драйверы устройств для 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 drivers на русском

Библиотека сайта rus-linux.net

Русский вариант Linux Device Driver 2-nd edition

Дата создания документа: 03.08.2004
Дата последнего изменения: 03.12.2004
Автор: Князев Алексей. knzsoft@mail.ru
ICQ: 194144861

Представляю вам часть работы над переводом известного фундаментального труда по написанию драйверов в Linux – Linux Device Driver 2-nd edition от Alessandro Rubini & Jonatan Corbet. В процессе чтения оригинального материала я принял решение построить русский вариант этого материала не в виде дословного перевода, а скорее “по мотивам” перевода. Из-за отсутствия фантазии и серьезного опыта в разработке драйверов под Linux я придерживаюсь оригинального материала, но с некоторыми, иногда обширными отступлениями. Эти отступления относятся, во-первых, к ядру 2.6.x, которое просто не представлено в оригинале по причине относительной давности материала, а, во-вторых, я попытался, на свой взгляд, ввести дополнения к оригиналу, в целях упрощения усвоения материала новичками. Ну, возможно, есть и будет что-то еще. Вообще, я собираюсь дополнить материал дополнительными примерами.

Надеюсь на вашу помощь в тестировании и исправлении ошибок материала.

Просьба. Поскольку я не имею возможности средствами сайта определять посещаемость данного материала, то у меня будет просьба к тем, кому этот материал нужен. Отписывайтесь мне на e-mail. Так я смогу оценить востребованность материала. Присылайте, также, номера еще не переведенных глав, которые были бы вам интересны. Я буду стараться акцентировать внимание на наиболее востребованных главах. Кроме того, мне было бы интересно знать: какими задачами вы занимаетесь, для души или по работе, и как вы попали на эту страницу моего перевода. Также, напишите, считаете ли вы полезным публикацию данного материала в виде печатного издания – С уважением, Князев Алексей.

Источник

Материалы для изучения Linux Kernel и написания модулей/драйверов

1) Самая лучшая книга по ядру – это исходники. Лучший сайт по исходникам ядра, я считаю

Поиск по идентификатору, например вводите struct file и вперед, смотреть как и что.

2) Начнем с русского языка. Очень хорошо описал написание дров, модулей и проччих вещей в ядре – Олег Цилюрик. Очень редко можно встретить более менее актуальный материал по ядру на русском! Очень рекомендую.
http://rus-linux.net/MyLDP/BOO. index.html

3) На opennet.ru тоже есть материал на русском, но там немного посложнее, средний уровень подготовки я считаю, но мне как новичку помогло.

4) Теперь перейдем к топовым книгам. Коротенькая, информативная, стандарт для разработчиков ядра, это конечно же Linux Device Driver, 3 издание и Adison.Wesley.Linux.Kernel.Development.3rd.Edition . По первой (LDD) я делал мноиге примеры, очень рекомендую ее. Вторая как раз по структуре ядра, идеальная прям, открываете оглавление и читаете то что интересно.

Первая книга есть в октрытом доступе, вот оффициальная ссылка.
http://lwn.net/Kernel/LDD3/

5) По написанию дров под линь, очень мало современных материалов и книг, очень прям мало. Потому что ядро развивается очень быстро, каждый день сотни коммитов, поэтому уследить трудно. Но есть еще одна хорошенькая книга. Называется Essential Linux Device Drivers.

6) Фундаментальный труд по ядру, это конечно же книга – Undestanding the linux kernel,3rd edition (почти 1000 страниц)

Рекомендую Adison.Wesley.Linux.Kernel.Development и Цирюльника, для старта самое то.

Есть еще очень хороший сайт
http://eudyptula-challenge.org/
Который высылает вам задание на почту по программированию в ядре, сложность нарастающая, начиная с hello world, заканчивая патчами в РЕАЛЬНОЕ ядро. Многие после прохождения всех заданий, реально получают работу как kernel developer\kernel hacker.[/QUOTE]

На моем гитхабе вы можете посмотреть следующие примеры (которые перекликаются с примерами из книги Linux Device Driver):

Источник


Adblock
detector