Как стать автором
Обновить

Комментарии 41

Почти все разделы LDD (как 2, так и 3) уже переведены вроде бы… Да и на Хабре подобные посты есть, например, вот

То, что вы разбирались с проблемой «написания драйверов под Linux» по LDD (Linux Device Drivers), видно сразу — название структур драйвера даже не удосужились поменять))) Тогда вопрос/рекомендация: «Как Вы считаете, стоит упомянуть LDD в списке литературы поста?»

Второе, о что споткнулся мой мозг — это определение «Символьного драйвера». Оно без понимания сути и контекста просто выдернуто из аннотации к разделу про символьные драйвера из LDD. Хотя, правильное и полное определение дается еще во Введении.

И да, в посте Вы не указали, под какое ядро Linux пишете драйвер, а это важно.
Добрый день.
Да, вы правы, действительно статьи есть, но та статья, которую вы упомянули требует дополнительного аппаратного обеспечения, символьный же драйвер, не требует, по сути, ничего.
По поводу, литературы, вы также абсолютно правы, я хотел бы привести список, когда написал бы последнюю часть этой статьи.
Названия не менял по этой же причине, я не хотел показать, что я написал драйвер, не используя литературы, наоборот, я хочу чтобы люди, которые хотят попробовать написать драйвер имели больше информации и пояснений.
По поводу второго вашего замечания, как бы вы дали определения символьного драйвера? (Который по сути и работает с памятью, которое выделило ядро, и единственные действия, которые осуществляет, copy_from/to_user space.)

Самое простое и понятное определение символьного драйвера — это драйвер для символьных устройств (классификация типов устройств приведена во введении LDD). А Вы привели определение именно Вашего драйвера с учетом его функционального назначения — это не верно.

Литературу приводят обычно в первой части цикла статей, либо в аннотации к циклу.

Да, вы правы, действительно статьи есть, но та статья, которую вы упомянули требует дополнительного аппаратного обеспечения, символьный же драйвер, не требует, по сути, ничего.

Открою Вам секрет, LPT-порт — это символьное устройство, а значит и драйвер к нему тоже символьный)) (опять Вы «по верхам» смотрели)
И еще одно важное замечание, не все драйвера, которые работают с памятью ядра, являются символьными — например, драйвер RAM-диска блочный. Об этом Вы еще прочитаете в других разделах LDD, чего я искренне желаю, если не потеряете интерес к этому после диплома.
Я когда писал драйвер столкнулся с тем, что кое-что из LDD 3rd Ed. уже не соответствует действительности — устарело.

Еще могу добавить, что для себя я понял, что эксперименты с ядром Линукс удобно проводить с Raspberry PI3. Почти настоящий компьютер, стоит не дорого, если при ошибке в кернел упадет — не жалко. Легко привести в исходное состояние перезаписыванием флешки.
нельзя просто так взять и написать драйвер. Всё написанное выше актуально ТОЛЬКО к конкретной версии ядра! Поэтому автору следует указывать какая версия ядра. Даже если меняется последний номер может всё перестать работать!!!

А эксперименты лучше всего проводить на виртуалке — всё сильно быстрее и удобнее. А любое оборудование легко в неё шарится.
Да, виртуалка — это тоже хороший метод.
В ряде случаев единственный.
Когда я только начинал писать драйвера под Linux (толком и с Linux-ом тогда и не был знаком, но по работе пришлось заняться), на первых же тестах драйвера система валилась с порчей файловой системы (блочный драйвер я писал). В тот день мне пришлось раз пять переустанавливать Linux (МСВС 3.0 на ядре 2.4.32). На следующий день я установил ее на виртуалке и с тех пор уяснил, что при «системном творчестве» виртуалка обязательна, что под Windows, что под Linux)))
Копировать и разворачивать в десятки раз проще.
Полностью с Вами согласен. Так я в последствии и поступал.
Даже если меняется последний номер может всё перестать работать!!!

Почему? Интересно, отчего такая лютая несовместимость.
Нет стандарта кода на ядро. На пространство пользователя есть, а на ядро нет. Поэтому оно динамически развивается наращивая глюки
Спасибо. А есть какие-нибудь конкретные примеры несовместимости?
Эм? Ну примеры книги LDD2 не будут работать на современных ядрах, например. Какие примеры вам нужны? Другие названия функций, другие вызовы и т.п.
Другие названия функций, другие вызовы и т.п.

А, даже настолько…
Мне это удивительно, потому что в основном примеры под какой-нибудь NT 3.1 и под 7-8-10 заведутся (не считая защитных механизмов).
Да, именно так. Но в этом есть неоспоримый плюс, поэтому на ядерном уровне вирусы слабо возможны, так как механизмы внедрения не будут работать при следующем обновлении системы.
Например, в одной версии ядра было нужное поле в структуре, которое использовал драйвер, а при при переходе на новую ветку это поле исчезло из одной и переехало в другую. Выше правильно сказано, поменялось название функции к примеру.
Да там всё может поменяться. Может порядок аргументов в функции. Короче, гадость, если нужна поддержка многих ядер.
Это мою статеечку что ли привели?
Она оказалась удачным примером по двум причинам:
1) первая после текущей в списке поиска Хабра по запросу «linux device drivers»;
2) удачная в плане изложения и структуры.
Да, с той целью и писалась. Писал около полутора месяцев.
Делению устройств на блочные и символьные (именно в русскоязычной литературе) уже много десятков лет, странно, что требуется дополнительное описание.
Статья ориентирована на начинающих и у автора статьи было некорректное определение символьного драйвера. Поэтому, чтобы оградить начинающих от некорректности в базовых определениях, мной и было предложено скорректировать определение.
А Вы привели определение именно Вашего драйвера с учетом его функционального назначения — это не верно.
Соглашусь, был рассмотрен частный случай. Я пытался, каким то образом обобщить определение (Попытка провалилась:().
Литературу приводят обычно в первой части цикла статей, либо в аннотации к циклу.
Действительно, лучше сразу указать.
Открою Вам секрет, LPT-порт — это символьное устройство, а значит и драйвер к нему тоже символьный)) (опять Вы «по верхам» смотрели)
И еще одно важное замечание, не все драйвера, которые работают с памятью ядра, являются символьными — например, драйвер RAM-диска блочный. Об этом Вы еще прочитаете в других разделах LDD, чего я искренне желаю, если не потеряете интерес к этому после диплома.
Да, я знаю, что LPT порт — это символьное устройство))
Но, спасибо за замечания, попытаюсь учесть.
Всегда рад помочь. Удачи Вам в Вашем деле.
Спасибо, интересно для общего развития. Никогда не писал драйвера под Линукс. Писал мелкий драйверок под винду и крупный проект под линь.
Больше минусов, больше!!! Особенно без коментариев ) Обожают этот ресурс )
Нам же интересно знать что вы не писали драйверов под линукс! Это же бесценный комментарий ;).
Ок, ухожу-ухожу-ухожу.
НЛО прилетело и опубликовало эту надпись здесь
Спасибо, в ближайшее время добавлю эту информацию.

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


Например, зачем вызывать kmalloc(), а потом memset(), если можно сразу же сделать kzalloc()?
Более того, есть еще и devm_kzalloc(), при использовании которого вообще не нужно думать об освобождении ресурса, см. https://www.kernel.org/doc/Documentation/driver-model/devres.txt.


Уверен, что разработчики, лучше меня знакомые с затронутой подсистемой, увидят и более специфические моменты.


Это я все к тому, что было бы здорово подавать хороший пример ("best practice", так сказать, на сегодняшний день), а не просто показывать некий код из книжки как-то и где-то работающий (в лучшем случае).

Да, вы правы, можно использовать обе функции, в статье же используется метод «в лоб», но упомянуть про эти них тоже стоит, добавлю в ближайшее время, спасибо.
Буду ждать следующую статью. Единственное что меня(IMHO) немного задело, это использование goto. Я думаю можно было обойтись и без него.
В модулях ядра нельзя без goto. Или скажем это плохой тон. Откройте любой драйвер и увидите там его, да любой код ядра вообще.
Не стоит ужасаться использования goto в данном примере, это обычная практика обработки ошибок в различных драйверах. Посмотрите lxr — очень полезный ресурс.
Это сделано для скорости.
Весьма недурная статья! Для начинающих драйвероидов очень полезна будет. Спасибо!
Для начинающих почитайте LDD. Ну и я как-то делал вебинар по модулям ядра linuxю Был бы спрос — провёл бы ещё.
Кстати, касательно ссылок. На мой пост привели ссылку, там я постарался очень кратко разжевать о написании драйверов на примере живого устройства (иначе зачем нужен драйвер?). И механизмы отладки. Но вот просто шикардосный гайд о создании реального рабочего устройства, лучшего в русскоязычном сегменте нет. Всё остальное спекуляции по LDD.
Часть 1
Часть 2
Часть 3

Обязательно указывайте версии ядра в котором вы ведёте примеры.
А по Windows такие статьи будут?
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации