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

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

Вот таких бы топиков побольше!
Это мой первый топик на хабре. Рад что вам понравилось :)
НЛО прилетело и опубликовало эту надпись здесь
До этого я долгое время был читателем хабра :) И смотрел как люди оформляют топики.
НЛО прилетело и опубликовало эту надпись здесь
Что же делать? Даже писать не хочется, если на главную попасть не можешь.
Первый блин не всегда комом)).
и таких бессмысленных комментариев поменьше
Да смотреть тошно на всю ту срань, что на главной развели.
Содержание главной зависит только от нас. Достаточно каждому выставлять в день по паре десятков плюсов-минусов, чтобы сделать «Хабр опять торт»
Стараемся в меру сил, но не всегда хватает терпения.
Это афигенно интересно! Прошу Вас продолжайте дальше!
P.S. Простите за эмоции просто давно здесь такого не видел.
Идея насчёт продолжения есть — я планирую написать про перехват системных вызовов с помощью LKM. Как будет время — обязательно напишу.
Буду ждать лично с нетерпение. И не я один!
нетерпением, простите
Очень понравилась статья. Но стоит исправить мелкие опечатки. Однозначно в избранное.
Спасибо. Обязательно поправлю опечатки.
Опечатки в строках 10 23 52
Исправил
«LKM для 2.6 отличается от 2.4» Где можно почитать о различиях?
Почитать можно всё в том же LKMPG. Цитата: «LKMPG (Linux Kernel Module Programming Guide), имеющее версию 2.4.x относится к ядру 2.4.x, а LKMPG 2.6.x — к ядру версии 2.6.x.»
Большое спасибо.
Главное, чтобы новички не закопались с этой замечательной книгой, поскольку многие примеры не работают на текущих ядрах без небольших изменений. Это касается всего, что связано с очередями worqueue, небольшие изменения в примере по прерываниям, перехват системных вызовов потребует элементарного поиска sys_call_table и знания механизмов защиты памяти. Да и прототипы функций многих API ядра часто меняются.

Для того, чтобы совсем не потеряться в ядерном мире и быть в струе, быстро находя изменения, новичкам можно посоветовать the Linux Cross Reference
Хороший, понятный топик. Ничего лишнего.
Спасибо, Вам стоит задуматься над идеей написания «Linux Kernel for Dummies» :)
Спасибо большое. Ваша статья мне очень помогла. Насколько я понял, Ваше устройство не связано с реальнім физическим устройством. Как добавить в систему свое физическое устройство? (Укажите хоть порядок действий)
При обращении к файлу устройства вызываются функции-обработчики действий открытия, закрытия, чтения и записи файла, которые вы можете задать для него, используя структуру file_operations. Вы можете получать данные, которые пользовательская программа записывает в ваш файл устройства, соответствующим образом реагировать, отправлять часть данных реальному устройству через порты ввода-вывода, обрабатывать прерывания от реального устройства и отдавать ответ пользовательскому приложению через тот же файл устройства.

Для реальных проектов иногда лучше подходит обработка ioctl вызовов. Хотя и просто через файл всегда можно реализовать.
Да, Вы правы, /dev/test не связано ни с каким реальным устройством. Насчёт написания настоящего драйвера — советую почитать «Linux Device Drivers» от O'Reilly
Разницы никакой нет, будь то физическое или виртуальное устройство. Файл устройства создается именно так, как это представил автор. Разница в том, что в случае с реальным устройством, вы будете использовать этот файл для связи с пространством пользователя, а остальная работа по взаимодействию с устройством в пространстве ядра ложится на ваши плечи.
>физическое или виртуальное устройство. Файл устройства создается именно так

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

или, что еще правильней, регистрируется драйвер, который работает с устройствами определенной модели и ждущий, пока появится новое железо с определенными параметрами (в usb — vid, pid, class).

хотите простых примеров — смотрите в drivers/input/ или tty, там все красиво, понятно и по делу
TTY был описан и в Linux Device Drivers 3 довольно подробно. А вот от примеров по usb или, так или иначе связанных с сетью, не отказался бы. Спасибо за полезное начинание.
с usb самое главное — понять терминологию. дальше все просто до неприличия и нормально решается даже из юзерспейса.

если из ядра — поймать устройство через vid/pid и повесить коллбеки на приход пакетов по нужным портам (ep).

больше мороки будет с обработкой данных и тем классом устройства, которое этот драйвер реализует, а сама отправка-получка там тривиальна.
Упс, промахнулся. Автор топика-то не вы. Но, было бы здорово и вас почитать. Не думаете пару-тройку статей написать? Думаю, если вопрос в количестве кармы, то его быстро решат в вашу пользу. Было бы интересно. Всегда интересно видеть взгляд человека, который поварился в этом некоторое время.
>Не думаете пару-тройку статей написать?

про терминологию usb собирался как-то, но на хабре — увы и ах, тутошняя система мотивации и поощерений меня не любит.
Спасибо.
Хабру не хватает таких постов.

Спасибо.
Классная статья! Спасибо!
за такие отступы и пробелы в LKML дают канделябром по коммит-аццессу
Извините, торопился и, что бы было быстрее, засунул код в «Antechinus Code Chameleon». Постараюсь поправить руками.
checkpatch.pl и lindent вам в помощь
Извините, торопился и, что бы было быстрее, засунул код в «Antechinus Code Chameleon». Постараюсь поправить форматирование руками.
Упс. Извините ещё раз :) «Дежавю» :)
Отличная статья. Очень интересно.
Ребят, не все пользователи Linux станут писать драйвер, и я думаю именно для таких целей, было бы неплохо сделать блог под названием «Linux Hardcore» или «Linux для профессионалов» (хоть и уже есть целых два блога Linux не для всех, но они не подходят по тематике) и выкладывать там статьи похожего содержания, а также статьи про тонкую настройку веб серверов, про использование консоли в профессиональных целях и т.п. А блог «Linux для всех» оставить для статей общего характера и для пользователей абсолютно любого уровня.
Спасибо за статью.
Хотелось бы в следующей статье увидеть разработку драйвера для какого нибудь простейшего реального устройства :)
Можно добавить файл устройства в /dev сразу после регистрации модуля.
$ man 2 mknod
GregKH благодарен вам за статью )
Шикарная пятница по топикам вышла! Это очередной бриллиант в сегодняшней коллекции.
Скажем «НЕТ» пятничным сиськам на хабре! -)
даёшь драйвер к /dev/boobs!
эх…
bondbig@bondbig-laptop:~$ touch /dev/boobs
touch: невозможно выполнить touch для `/dev/boobs': Отказано в доступе
Вот так всегда в жизни и случается…
>Скажем «НЕТ» пятничным сиськам на хабре! -)

пропоганда гомосексуализма на моем хабре?
отличная статья.

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

все равно, хорошо, что кто-то не поленился написать для новичков мануал.
> Linux Kernel Module или загрузочный модуль ядра
Linux Kernel Module логичнее перевести как модуль ядра линукс, так как слова загрузочный там нет
На самом деле там Loadable Kernel Module(Загружаемый Модуль Ядра), странно что никто не заметил.
Топик люто плюсую, такие топики должны быть на хабре.
топик полистал, всётаки хотелось бы чтобы в нем было хоть в общих чертах описаны различия символьных и блочных устройств. ну и какбы не каждая ошибка в LKM приводит к кернел панику, в большинстве случаев драйвер просто будет выгружен.
>драйвер просто будет выгружен.

это как так? если напротыкать в init — он не будет загружен
ну или так
Спасибо Большое! Очень полезно и интересно!
прочитал, отличная статья, ночью попробую! :)
Ночью? Мол, лучше время для компиляции? :)
Ночью дома никто не мешает!
я очень надеюсь, что вы топиком ошиблись.
> Только что в голову пришла совершенно безумная идея сделать sudo через файл устройства. Т.е. посылаем в /dev/test команду и она выполняется от имени root.

Я когда-то думал об этом, только зашел чуть подальше. Опишу концепт, поэтому просьба сильно не пинать и конструктивно критиковать.

Создаем, например, каталог /dev/perm/, в котором есть несколько типов файлов устройств:
1) системные (root, nobody, syslog, daemon, bin, sys), лежат в /dev/perm/system/;
2) сервисные (устанавливаются вместе с ПО, например, apache, mail, proxy, backup), расположены в /dev/perm/software/);
3) пользовательские (создаются вместе с новыми пользователями, user1, user2 и т.д.), их место — /dev/perm/user/.

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

Рассматриваем классический и «наш» способ:
1) sudo su - www-data -c 'mkdir /var/www/test'
2) echo 'mkdir /var/www/test' > /dev/user/software/www-data


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

Вот пример с хуком на прокси-сервер:
1) sudo su - root -c 'service squid restart'
2) echo 'restart' > /dev/user/software/proxy


Во втором случае можно легко настроить права пользователям/группам, которым разрешено администрировать прокси-сервер, к тому же они могут управлять ими, совершенно не задумываясь о «внутренностях».

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

Вся эта идея может сильно помочь в многопользовательских системах и/или системах с большим количеством групп/виртуальных машин.
>sudo su — www-data -c 'mkdir /var/www/test'

ересь, man 8 sudo

>Во втором случае можно гибко настроить права,

а через sudo нельзя, да? man 5 sudoers, читайте
> ересь, man 8 sudo

Подробнее?

> а через sudo нельзя, да? man 5 sudoers, читайте

Через sudo нельзя, например, разрешить кому-либо только перезапускать прокси.
Причем неизвестно заранее какой.
> Подробнее?

sudo -uwww-data mkdir /var/www/test

> Через sudo нельзя

Что нельзя? Разрешить только перезапускать прокси? Можно.
Не известно какой нельзя, но и в вашем случае система должна откуда-то узнать, что именно ей делать по команде «proxy restart». :)

А идея интересная, только боюсь — не секурно.
а че плюсуем то, копипаста же?
Ну не совсем копипаста уж, статья несколько переработана (и сокращена). Я по этой статье с цитфорума ещё лет 5 назад пытался что-то подобное написать :) Вот намедни в песочнице лежала статья — полная копия главы книги по ассемблеру 1989 года. Вот это копипаста) Её я тоже сразу же узнал (раньше изобилия книг не было, так что читать приходилось всё). И ведь кто-то ещё за неё инвайт получил…
Чего только не придумают красноглазые, лишь бы не отдыхать с тёлочками :)
Съебался, быстро!
Добавление к UDP3: атомарные операции нужно использовать во всех местах работы с данными. В данном случае и в close().

Защищать нужно не код, а данные :)
Добавил
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации