LINUX.ORG.RU

Написание драйверов в Linux, две части


0

1

Две статьи Майка Гоблина:

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

http://genphys.phys.msu.ru/~dmitriyk/...

http://genphys.phys.msu.ru/~dmitriyk/...

не помню, но хорошо бы их продублировать гденнить еще...

☆☆

Проверено: Demetrio ()

Чего-то ничего у меня не получается. Компилится обычный обьектный файл. Может это из-за того что ядро - 2.6? Как быть?

anonymous
()

Я не дочитал до конца, и не знаю, работает ли этот модуль, но статья достаточно безграмотная.

Например:

>Символьные. Чтение и запись устройства идет посимвольно. Примеры таких устройств: клавиатура, последовательные порты.

>Блочные. Чтение и запись устройства возможны только блоками, обычно по 512 или 1024 байта. Пример – жесткий диск.

Разница не в этом. Разница в том, что блочные устройства имеют размер и допускают операцию позиционирования (lseek)

>Директива –DLINUX говорит компилятору о необходимости генерировать код под Linux.

Ничего подобного. Знающие gcc и так знают, что это означает. А незнающих может ввести в заблуждение. Лучше бы вообше ничего не писал.

А вообще-то конечно - статья полезная. Жаль, что мне не нужно писать модули к ядру.

smartly ★★★
()

Вторая статья более содержательная чем первая, всё таки лучше модули ядра компилировать включая их в дерево ядра, и не трахаться с настройками компилятора. Хорошо что появляются такие статьи, люди хоть перестанут бояться Линуха.

Oksiv
()
Ответ на: комментарий от Oksiv

Наконец хоть кто то что полезное написал, ИМХО очень полезная статья. Глядишь и дрова для линуха появляться быстрее будут :)

cyclon ★★★★★
()

2vilfred

Spasibo tebe chuvak. Ja pisal drajver dlja MSDOS na asm-e i nadejus pod Linuhom tozhe poluchitsa

Pardon za translit

anonymous
()
Ответ на: комментарий от Oksiv

> всё таки лучше модули ядра компилировать включая их в дерево ядра

Вот этого как раз не надо делать, потому что тогда для сборки модуля понадобится это самое дерево. Я этого дерьма накушался когда модем запускал. Для сборки модуля ядра должно быть достаточно того, что в /usr/include/linux, и, должен сказать, этого не так сложно добиться в большинстве случаев.

max630
()

>Захват портов ввода-вывода осуществляется в функции module_start

Для выделения портов железки лучше использовать прототип функции request_region,определенный в linux/ioport.h

#define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name))

Для выделения памяти iomem железки лучше использовать прототип функции request_mem_region,определенный в linux/ioport.h

#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name))

Вообщем статья, так себе.

Есть директория documention в ядре.

Есть книжка Померанца, где он описывает все подробно.

http://www.okc.ru:8080/okc/publish/imag.nsf/book/5-93378-008-1?OpenDocument&a...

Она еще гуляла в электронном виде по ине-т, я ее в свое время видел на http://www.linux.perm.ru

Есть на gazette linux статья The Linux Kernel Module Programming Guide:

http://gazette.linux.ru.net/rus/articles/lkmpg.html

rjaan ★★
()

Вот у меня перед носом лежит "Ядро Linux. Программирование модулей". Ори Померанц, 2000. Стоила она всего 34 рубля. Там всё под 2.0 и 2.2, но общий принцип сохранён. А ещё есть целый pdf (даж в исходниках) про программирование драйверов под линух (2.4), но на аглицком.

anonymous
()
Ответ на: комментарий от cyclon

> Наконец хоть кто то что полезное написал, ИМХО очень полезная статья. Глядишь и дрова для линуха появляться быстрее будут :)

И также быстро исчезать... Лучше бы Линус пошел по пути MS и сделал бы в линуксе аналог WDM.

З.Ы. Полезная статья.

anonymous
()
Ответ на: комментарий от anonymous

> И также быстро исчезать... Лучше бы Линус пошел по пути MS и сделал бы в линуксе аналог WDM.

Ну так может кто то сподобиться и напишет такие дрова, вот и будет всем счастье. Может даже я :) Знать бы где достать инфу по написанию таких дров.

cyclon ★★★★★
()
Ответ на: комментарий от anonymous

Вообще-то это WDM - аналог принципа построения драйверов в линухе. И то кривой - когда пишешь драйвер под WDM приходится вставлять кучу ненужного и бестолкового кода, тогда как в линухе достаточно не писать ненужную функцию, а в структурку загнать NULL.

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

ЗЫ: Под линух дрова действительно писать очень просто.

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

Qecho

> приходиться каждый раз пересобирать дрова под новое ядро
это нерпвда - это зависит от соотв-их пунктиков сборки ядра и как собран драйвер CONFIG_MODVERSIONS=n и опа!

mumpster ★★★★★
()

>>> но хорошо бы их продублировать гденнить еще.

На linuxportal.ru не хочешь выложить? Там просто - регистрируешься, сваливаешь в Отдел комплектования и через некоторое время, после достижения кондиции, текст перемещают в Библиотеку.

geekkoo
()
Ответ на: комментарий от fortl

Это не моя статья, я только пошел в библиотеку и набил вторую часть статьи из журнала "Программист". А на этой или той неделе выложу датчик облачности при помощи веб или любой видеокамеры. Я там пока затрахался с сишным кодом и сейчас растрахиваюсь потихоньку.

vilfred ☆☆
() автор топика
Ответ на: комментарий от anonymous

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

Тошнота у Вас , видимо, по другой причине. Было бы желание разобраться.

> >ЗЫ: Под линух дрова действительно писать очень просто.

Конечно , легче. open,close,write,read.... И все... А где функции энергосбережения? Где остановка/старт устройства... Конечно, через пару лет появится. А пока... это , вероятно, считается достоинством Linux ядра.

anonymous
()

Старовата мулька. Для 2.4 еще пойдет (для старых), а для 2.6 уже кисловато.

anonymous
()

Дим!

Не уж то ты таки написал СВОЙ драйвер к той штуковине, про которую рассказывал? А я то думаю, чего это ты в последнее время похож на "небритого, взъерошенного программиста, сутками просиживающего...". ^_^

Ты б хоть рассказал бы миру, чем именно тебе помогли эти статьи.

Шифт.

svSHiFT
()

Ужыс.

До чего онанимусы необразованные пошли. Один не знает про команду insmod -f ..., другому помимо open,close,read,write еще зачем-то 'функции энергосбережения' понадобились (они и так есть, а вот выносить их на операции с файлом устройства совсем необязательно).

geekkoo
()
Ответ на: комментарий от svSHiFT

да надо чето делать, вот я и делаю, пока датчик облачности надо вылизать.

А вообще, походу, мож и сделаю. Только денег много надо для этого, хотябы на шаговые движки.

:)

vilfred ☆☆
() автор топика

тем кто интересуется написанием драйверов для Linux советую заглянуть в "Linux Device Drivers" написанную Alessandro Rubini и Jonathan Corbet.

anonymous
()

Очень полезная статья. Эта статья нужна для тех, кому надо запрограммировать простой девайс типа шагового двигателя или АЦП, что в досе делалось прямой записью в порты, память, и обработку прерываний. Для тех, кто ночами просиживает за компом не потому, что ему нравится M$ или linux, а потому что необходимо чтобы девайс работал.

rgbeast
()
Ответ на: комментарий от anonymous

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

Вообще-то так и было задумано.
Ибо нефиг.

anonymous
()

Доброго времени суток!

Так-с, почитал статейку и решил сбацать модуль (глядишь на будущее пригодится). Взял второй пример из первой стать и собрал не большой модуль... test1.o

Первая мысль - почему .o а не .ko, ведь ядро 2.6.x? Ну думаю ладно, может так было задумано.

выполняю команду
$ sudo /sbin/insmod test1.o
insmod: error inserting 'module.o': -1 Invalid module format

Что не так?

Makefile не много изменил:
CC=gcc
MODCFLAGS = -Wall -DMODULE -D__KERNEL__ -DLINUX -DCONFIG_M686

test1: test1.c /usr/include/linux/version.h
$(CC) $(MODCFLAGS) -c test1.c

daemon73 ★★
()
Ответ на: комментарий от daemon73

> insmod: error inserting 'module.o': -1 Invalid module format
Опечатался -
insmod: error inserting 'test1.o': -1 Invalid module format



daemon73 ★★
()
Ответ на: комментарий от daemon73

Дело в том, что в 2.6 сборка модулей происходит несколько иначе...

вот урл туда я выложил некоторое кол-во доков, по ядерному программированию, которое у меня накопилось за последнее время. Наслаждайтесь... :)

prox
()
Ответ на: комментарий от max630

Видишь какие у людей проблемы, а если бы в дерево Линуха включили было бы всё проще, конечно я гооврю о ядре 2.6.x там другая система конфигурации, там всё гораздо проще чем в 2.4.

Oksiv
()
Ответ на: комментарий от anonymous

>Конечно , легче. open,close,write,read.... И все... А где функции энергосбережения? Где остановка/старт устройства...

А про ioctl не слышал?

anonymous
()
Ответ на: комментарий от vilfred

А то я тут проезжал мимо, на своем лексусе, и в голове автоматом

мелькнуло: "Обана. Опять Димон хулиганит"

Sun-ch
()
Ответ на: комментарий от anonymous

Не могу без слёз читать такое:

>>Конечно , легче. open,close,write,read.... И все... А где функции энергосбережения? Где остановка/старт устройства...

И это после трицати лет упорных трудов основателей Unix, и более десяти лет появления Posix!!! И около восьми лет как в windows! Темнота....

Славо богу добрый человек ему уже подсказал: "А про ioctl не слышал?".

anonymous
()

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

Я взял аиптековский модуль ядра и по его примеру сваял модуль для этой железяки. Модуль использует аиптековские иксовые драйвера. Модуль не поддерживает снятие давления(покрайней мере я так и не понял как его аиптековскому иксовому модулю передать), но по крайней мере планшет работает как мышь(а мне больше ничего не надо -- я векторы рисую, а ручкой всяко удобнее чем мышой).

может кто скажет, как надо оформить заявку и куда отправить на то чтобы этот модуль рассмотрели кернелдевелоперы на предмет добавления в ядро?

Ingwar ★★★★★
()
Ответ на: комментарий от anonymous

>Не могу без слёз читать такое:

Я тоже рыдаю...

>И это после трицати лет упорных трудов основателей Unix, и более >десяти лет появления Posix!!! И около восьми лет как в windows!

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

>Темнота....

Надо полагать я разговариваю со светилом в области написания драйверов под обе системы?

>Славо богу добрый человек ему уже подсказал: "А про ioctl не >слышал?".

Слышал. А вот для

IRP_MJ_POWER IRP_MJ_DEVICE_CHANGE IRP_MJ_PNP

достойных аналогов не нашел. Может подскажите?

anonymous
()
Ответ на: Ужыс. от geekkoo

>До чего онанимусы необразованные пошли. Один не знает про команду >insmod -f ..., другому помимо open,close,read,write еще зачем->то 'функции энергосбережения' понадобились (они и так есть, а вот >выносить их на операции с файлом устройства совсем необязательно).

Это не операции с файлом. Это запрос операционной системы на перевод устройства в заданное состояние.

И без этого невозможно реализовать , скажем , режим "hibernate". То , что стало , стандартом "де-факто" для win-драйверов , пока только в зачаточном состоянии в Linux.

А еще на Linux-desktop замахиваются...

anonymous
()
Ответ на: комментарий от anonymous

Чего-то я не всасываю. Ну так для каждого устройства, которое обладает возможностью изменять состояние, пишешь код и дергаешь его через IOCTL в нужный момент. Другой вопрос, что нет особых договоренностей о стандартном интерфейсе для этих вещей для драйверов. Ну вот нажал я кнопку Sleep. А винды дергают у всех драйверов эту функцию, рассылая запрос на переход в standby, тем, кто умеет это делать. Я правильно понял?

Zubok ★★★★★
()
Ответ на: комментарий от anonymous

Ужыс.

>>>Это запрос операционной системы на перевод устройства в заданное состояние.
Бессмысленная фраза. Что такое операциионная система? Ядро? Функции acpi находятся в ядре. В любом случае запрос на hybernate будет обработан ядром. Любой модуль ядра имеет доступ к namespace ядра. Зачем нужна еще одна функция для работы с файлом устройста, если модуль, автор которого сочтет нужным реализовать режим hybernate, может просто использовать функции ядерной acpi подсистемы.

geekkoo
()

Дело в том, что статье уже более 3 лет. Первая была напечатана в журнале программист(rip) в сентябре 2001, вторая в октябре. Тогда, когда я развлекался с 2.4 ядрами все это было интересно и работало

anonymous
()
Ответ на: комментарий от smartly

> >Символьные. Чтение и запись устройства идет посимвольно. Примеры
> >таких устройств: клавиатура, последовательные порты. 

> >Блочные. Чтение и запись устройства возможны только блоками, обычно
> >по 512 или 1024 байта. Пример – жесткий диск. 

> Разница не в этом. Разница в том, что блочные устройства имеют
> размер и допускают операцию позиционирования (lseek)

Существуют RAW-диски. Они также "имеют размер и допускают операцию
позиционирования (lseek)".

R3M
()
Ответ на: комментарий от dip

"сборки ядра и как собран драйвер CONFIG_MODVERSIONS=n и опа!"
Угу. И после этого nvidia drivers говорят про не найденные символы...

"Вообще-то так и было задумано. Ибо нефиг."

Вообще-то хреново задумано. Тут постоянно хвастаются аптаймами по три года и об установке драйверов без перезагрузки.....что - в линуксе уже можно менять ядро на ходу?

anonymous
()
Ответ на: комментарий от anonymous

> Две статьи Майка Гоблина

Писдец... Дравера от Гоблина. С Божьей искрой

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.