Не могу запустить драйвер

Вопросы программного кода и архитектуры Linux

Модератор: Olej

just_a_student
Писатель
Сообщения: 20
Зарегистрирован: 11 июл 2013, 20:57
Контактная информация:

Не могу запустить драйвер

Непрочитанное сообщение just_a_student » 11 июл 2013, 22:19

Здравствуйте! В данный момент изучаю книгу Linux Device Drivers 3. В ней в качестве учебного драйвера приводится пример символьного драйвера scull.
Исходники этого драйвера я скачал тут: https://github.com/martinezjavier/ldd3/ ... ster/scull
(Это офф источник указанный в книге).
Сборка прошла без проблем, но запустить я его так и не смог.
После сборки запуск производится скриптом scull.init с параметрами: start, stop, reload и т.п.
В ответ на команду

Код: Выделить всё

sudo ./scull.init start  
получаю следующий вывод:

Код: Выделить всё

Loading scull (loading file ./scull.o)insmod: error inserting './scull.o': -1 Invalid module format
FAILED! 
Первая и последняя части сообщения (до insmod и FAILED!) выводит скрипт.
Так как сборка прошла успешно, то подозреваю, что проблема именно в scull.init.
Одно из предположений проблемы: в скрипте есть следующий участок:

Код: Выделить всё

#FIXME: it looks like there is no misc section. Where should it be?
MODDIR="/lib/modules/${KERNEL}/kernel/drivers/${SECTION}"
if [ ! -d $MODDIR ]; then MODDIR="/lib/modules/${KERNEL}/${SECTION}"; fi
Судя по всему, автор скрипта хотел чтобы пользователь что-то изменил в нем, но я не понимаю, что именно.

Помогите мне пожалуйста запустить этот драйвер и понять, что не так в скрипте.

P.S. драйвер можно так же запустить скриптом scull_load и отключить скриптом scull_unload (Они так же есть по ссылке). Однако при загрузке скрипта scull_load так же выскакивает ошибка insmod:

Код: Выделить всё

sudo ./scull_load
insmod: error inserting './scull.ko': -1 File exists 
Скрипт scull.init заменяет по функционалу scull_load и scull_unload, поэтому сосредоточиться решил на нем, но если поможете запустить драйвер с помощью scull_load, то тоже будет здорово!
Заранее спасибо!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Не могу запустить драйвер

Непрочитанное сообщение Olej » 12 июл 2013, 00:41

just_a_student писал(а):Здравствуйте! В данный момент изучаю книгу Linux Device Drivers 3. В ней в качестве учебного драйвера приводится пример символьного драйвера scull.
Исходники этого драйвера я скачал тут: https://github.com/martinezjavier/ldd3/ ... ster/scull
(Это офф источник указанный в книге).
Эта книга довольно старая, даже в 3-м издании, некоторые вещи там не соотвествуют текущему состоянию дел.
А примеры там - очень неудачные для начала изучения (громоздкие и перегруженные деталями).
Это ваш выбор, но я для начала советовал бы вам попрактиковаться с примерами вот отсюда: http://mylinuxprog.blogspot.com/2013/01/linux.html ... а потом уже грузите что хотите и откуда хотите (там, кстати, очень подробно описано о сборке, загрузке и выгрузке....)
just_a_student писал(а): Сборка прошла без проблем, но запустить я его так и не смог.
После сборки запуск производится скриптом scull.init с параметрами: start, stop, reload и т.п.
В ответ на команду

Код: Выделить всё

sudo ./scull.init start  
получаю следующий вывод:

Код: Выделить всё

Loading scull (loading file ./scull.o)insmod: error inserting './scull.o': -1 Invalid module format
FAILED! 
Вообще то, самая частая причина такого сообщения insmod ("Invalid module format") бывает когда не соответствует версия ядра: например, собирали вы make в 3.3.A, а запускать стараетесь в 3.3.A (или собирал без PAE а запускается с PAE) ... например после простейшего обновления версий ядра из репозитария.
just_a_student писал(а): P.S. драйвер можно так же запустить скриптом scull_load и отключить скриптом scull_unload (Они так же есть по ссылке). Однако при загрузке скрипта scull_load так же выскакивает ошибка insmod:

Код: Выделить всё

sudo ./scull_load
insmod: error inserting './scull.ko': -1 File exists 
А такая ошибка бывает когда экземпляр такого модуля уже был раньше загружен ... может с ошибками, неисправный и т.д.
just_a_student писал(а): Скрипт scull.init заменяет по функционалу scull_load и scull_unload, поэтому сосредоточиться решил на нем, но если поможете запустить драйвер с помощью scull_load, то тоже будет здорово!
Не морочьте мозги ... ни себе, ни другим ;-) :
- изучите команды:

Код: Выделить всё

# insmod scull.ko
...
# rmmod scull.ko
...
- загружайте и выгружайте модуль предназначенными для этого командами Linux, без всяких скриптов...
- и показывайте вывод команд сюда, если что-то не получается...
- а кроме того научитесь смотреть состояние загруженных модулей командами по типу:

Код: Выделить всё

$ lsmod | head -n4
...
- потому что для работы с модулями вам нужно, прежде всего, достигнуть понимания того, что происходит, а не фокусов с запуском чьих-то скриптов (тем более, что, как мне кажется, и со скриптовым языком bash вы не на коротке? ;-) ) ... а понимание приходит только через выполнение команд (разбирательство с командами).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Не могу запустить драйвер

Непрочитанное сообщение Olej » 12 июл 2013, 00:57

Olej писал(а):
just_a_student писал(а): Сборка прошла без проблем, но запустить я его так и не смог.
После сборки запуск производится скриптом scull.init с параметрами: start, stop, reload и т.п.
В ответ на команду

Код: Выделить всё

sudo ./scull.init start  
получаю следующий вывод:

Код: Выделить всё

Loading scull (loading file ./scull.o)insmod: error inserting './scull.o': -1 Invalid module format
FAILED! 
Вообще то, самая частая причина такого сообщения insmod ("Invalid module format") бывает когда не соответствует версия ядра: например, собирали вы make в 3.3.A, а запускать стараетесь в 3.3.A (или собирал без PAE а запускается с PAE) ... например после простейшего обновления версий ядра из репозитария.
А вообще такое сообщение ("Invalid module format") может говорить что в качестве файла модуля xxx.ko вы подсовываете команде insmod полную ерунду по формату.
Попробуйте для эксперимента ;-) :

Код: Выделить всё

bash-4.2$ echo 12345 > xxx.ko
bash-4.2$ sudo insmod xxx.ko
Error: could not insert module xxx.ko: Invalid module format
Т.е. вы можете напихать в файл что попало, и пытаться его загружать как модуль.
Это может говорить и о том, что сборка make совершенно не обязательно у вас нормально проходит - показывайте сюда вывод команды make.

Но неправильный файл у вас не будет идентифицироваться как модуль:

Код: Выделить всё

bash-4.2$ file xxx.ko 
xxx.ko: ASCII text
А правильный модуль у вас должен распознаваться как-то так:

Код: Выделить всё

bash-4.2$ file yyy.ko 
yyy.ko: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), BuildID[sha1]=0xc40a8c5aeac468450b227a106fe423ae1fb9d502, not stripped

just_a_student
Писатель
Сообщения: 20
Зарегистрирован: 11 июл 2013, 20:57
Контактная информация:

Re: Не могу запустить драйвер

Непрочитанное сообщение just_a_student » 12 июл 2013, 08:56

для начала советовал бы вам попрактиковаться с примерами вот отсюда: http://mylinuxprog.blogspot.com/2013/01/linux.html ... а потом уже грузите что хотите и откуда хотите (там, кстати, очень подробно описано о сборке, загрузке и выгрузке....)
За книгу огромное спасибо! Все очень подробно и просто - то что мне нужно :)) В LDD, все плохо объяснено... Мне ее предложил преподаватель в ВУЗе изучить, как задание на лето, возможно выбор не самый удачный.
just_a_student написал(а):
P.S. драйвер можно так же запустить скриптом scull_load и отключить скриптом scull_unload (Они так же есть по ссылке). Однако при загрузке скрипта scull_load так же выскакивает ошибка insmod:
Код:
sudo ./scull_load
insmod: error inserting './scull.ko': -1 File exists
А такая ошибка бывает когда экземпляр такого модуля уже был раньше загружен ... может с ошибками, неисправный и т.д.
Сегодня утром после перезагрузки компьютера скрипт scull_load выполнился без ошибок и драйвер запустился! Видимо в течении моих предыдущих попыток я что-то там загрузил таки в ядро, и правильный скрипт не работал.
- изучите команды:

Код: Выделить всё

# insmod scull.ko
...
# rmmod scull.ko
...
- загружайте и выгружайте модуль предназначенными для этого командами Linux, без всяких скриптов...
- и показывайте вывод команд сюда, если что-то не получается...
- а кроме того научитесь смотреть состояние загруженных модулей командами по типу:
В данном случае, как я понял, скрипт нужен не столько для загрузки модуля, сколько для создания узлов "устройств" в каталоге /dev/.
тем более, что, как мне кажется, и со скриптовым языком bash вы не на коротке?

Увы, это так :( Пользуясь случаем - посоветуйте пожалуйста учебник по Bash, по которой его можно освоить? Чтобы был от простого к сложному и без перегруженных примеров

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Не могу запустить драйвер

Непрочитанное сообщение Olej » 12 июл 2013, 11:26

just_a_student писал(а):В данном случае, как я понял, скрипт нужен не столько для загрузки модуля, сколько для создания узлов "устройств" в каталоге /dev/.
А зачем вам и в этом полагаться на какой-то скрипт (на дядю ;-) )? Создавайте имена устройств сами и присваивайте им нужные номера (major / minor):

Код: Выделить всё

bash-4.2$ man mknod
...
Впрочем, всё это показано на примерах в той книге, что я вам давал ссылку ... позже там, где "драйвера символьных устройств".
just_a_student писал(а):
тем более, что, как мне кажется, и со скриптовым языком bash вы не на коротке?

Увы, это так :( Пользуясь случаем - посоветуйте пожалуйста учебник по Bash, по которой его можно освоить? Чтобы был от простого к сложному и без перегруженных примеров
Так вот здесь же рядом описана лучшая из книг (перевод): Программирование сценариев bash - исчерпывающее описание, и всё на реальных примерах без никакого словоблудия.


Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя