Comments 41
То, что вы разбирались с проблемой «написания драйверов под Linux» по LDD (Linux Device Drivers), видно сразу — название структур драйвера даже не удосужились поменять))) Тогда вопрос/рекомендация: «Как Вы считаете, стоит упомянуть LDD в списке литературы поста?»
Второе, о что споткнулся мой мозг — это определение «Символьного драйвера». Оно без понимания сути и контекста просто выдернуто из аннотации к разделу про символьные драйвера из LDD. Хотя, правильное и полное определение дается еще во Введении.
И да, в посте Вы не указали, под какое ядро Linux пишете драйвер, а это важно.
Да, вы правы, действительно статьи есть, но та статья, которую вы упомянули требует дополнительного аппаратного обеспечения, символьный же драйвер, не требует, по сути, ничего.
По поводу, литературы, вы также абсолютно правы, я хотел бы привести список, когда написал бы последнюю часть этой статьи.
Названия не менял по этой же причине, я не хотел показать, что я написал драйвер, не используя литературы, наоборот, я хочу чтобы люди, которые хотят попробовать написать драйвер имели больше информации и пояснений.
По поводу второго вашего замечания, как бы вы дали определения символьного драйвера? (Который по сути и работает с памятью, которое выделило ядро, и единственные действия, которые осуществляет, copy_from/to_user space.)
Литературу приводят обычно в первой части цикла статей, либо в аннотации к циклу.
Да, вы правы, действительно статьи есть, но та статья, которую вы упомянули требует дополнительного аппаратного обеспечения, символьный же драйвер, не требует, по сути, ничего.
Открою Вам секрет, LPT-порт — это символьное устройство, а значит и драйвер к нему тоже символьный)) (опять Вы «по верхам» смотрели)
И еще одно важное замечание, не все драйвера, которые работают с памятью ядра, являются символьными — например, драйвер RAM-диска блочный. Об этом Вы еще прочитаете в других разделах LDD, чего я искренне желаю, если не потеряете интерес к этому после диплома.
Еще могу добавить, что для себя я понял, что эксперименты с ядром Линукс удобно проводить с Raspberry PI3. Почти настоящий компьютер, стоит не дорого, если при ошибке в кернел упадет — не жалко. Легко привести в исходное состояние перезаписыванием флешки.
А эксперименты лучше всего проводить на виртуалке — всё сильно быстрее и удобнее. А любое оборудование легко в неё шарится.
Даже если меняется последний номер может всё перестать работать!!!
Почему? Интересно, отчего такая лютая несовместимость.
Другие названия функций, другие вызовы и т.п.
А, даже настолько…
Мне это удивительно, потому что в основном примеры под какой-нибудь NT 3.1 и под 7-8-10 заведутся (не считая защитных механизмов).
А Вы привели определение именно Вашего драйвера с учетом его функционального назначения — это не верно.Соглашусь, был рассмотрен частный случай. Я пытался, каким то образом обобщить определение (Попытка провалилась:().
Литературу приводят обычно в первой части цикла статей, либо в аннотации к циклу.Действительно, лучше сразу указать.
Открою Вам секрет, LPT-порт — это символьное устройство, а значит и драйвер к нему тоже символьный)) (опять Вы «по верхам» смотрели)Да, я знаю, что LPT порт — это символьное устройство))
И еще одно важное замечание, не все драйвера, которые работают с памятью ядра, являются символьными — например, драйвер RAM-диска блочный. Об этом Вы еще прочитаете в других разделах LDD, чего я искренне желаю, если не потеряете интерес к этому после диплома.
Но, спасибо за замечания, попытаюсь учесть.
Скажите, а этот замечательный драйвер прошел ревью в соответствующем списке рассылки?
Думаю, что нет — уж больно много конструкций, которые при первой же итерации ревью обычно просят исправить.
Например, зачем вызывать kmalloc(), а потом memset(), если можно сразу же сделать kzalloc()?
Более того, есть еще и devm_kzalloc(), при использовании которого вообще не нужно думать об освобождении ресурса, см. https://www.kernel.org/doc/Documentation/driver-model/devres.txt.
Уверен, что разработчики, лучше меня знакомые с затронутой подсистемой, увидят и более специфические моменты.
Это я все к тому, что было бы здорово подавать хороший пример ("best practice", так сказать, на сегодняшний день), а не просто показывать некий код из книжки как-то и где-то работающий (в лучшем случае).
Часть 1
Часть 2
Часть 3
Обязательно указывайте версии ядра в котором вы ведёте примеры.
Как написать свой первый Linux device driver