создание модуля ядра linux
От: plastictown Норвегия  
Дата: 05.06.17 12:09
Оценка:
Доброго времени суток!
Сразу подробности:
Debian jessie x86
gcc version 4.8.4 (хотя я руками поставил 7.10, но кажется это никого не интересует))
Linux version: 3.16.0-4-686-pae
Пытаюсь создать модуль ядра пока ничего не делающий. Делаю как в The Linux Kernel Module Programming Guide и в куче его клонов в сети. Модуль компилится, появляется bla-bla.ko, insmod говорит Invalid module format. Вроде бы написано, что модуль скомпилирован не под ту версию ядра.
Исходники ядра брал из /usr/src/linux-source-3.16, который установил из синаптика.
В make все путя прописываю явно: make -C /usr/src/linux-source-3.16 SUBDIRS=/home/user/dir/km modules

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

Спасибо!
Re: создание модуля ядра linux
От: Zhendos  
Дата: 05.06.17 12:25
Оценка: +3
Здравствуйте, plastictown, Вы писали:


P>Подскажите, пожалуйста, каковы должны быть условия, чтобы вся эта машина заработала? Какие пакеты установлены, какие исходники ядра, где должны лежать и пр.


Все очень просто, ядро и модуль должны быть собраны из одних и тех же исходников,
с одним и тем же конфигом.
Т.е. в вашем случае для начала стоит попробовать взять тот же конфиг (zcat /proc/config.gz > path/to/kernel/sources/.config && make oldconfig -C path/to/kernel/sources/)
и если модуль все еще не загружается, то собрать ядро целиком из исходников, и перезагрузить машину с этим ядром.
Re: создание модуля ядра linux
От: IID Россия  
Дата: 05.06.17 14:05
Оценка: +1
Здравствуйте, plastictown, Вы писали:

P>Подскажите, пожалуйста, каковы должны быть условия, чтобы вся эта машина заработала? Какие пакеты установлены, какие исходники ядра, где должны лежать и пр.


мой опыт
Автор: IID
Дата: 19.09.16


ЗЫ: в итоге я unload добил, и даже опус написал по этому поводу. Лень постить.
kalsarikännit
Re[2]: создание модуля ядра linux
От: plastictown Норвегия  
Дата: 06.06.17 11:06
Оценка:
Здравствуйте, Zhendos, Вы писали:

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

Z>с одним и тем же конфигом.
Z>Т.е. в вашем случае для начала стоит попробовать взять тот же конфиг (zcat /proc/config.gz > path/to/kernel/sources/.config && make oldconfig -C path/to/kernel/sources/)
Z>и если модуль все еще не загружается, то собрать ядро целиком из исходников, и перезагрузить машину с этим ядром.

Шел третий день...
Я поставил ядро посвежее (4.9.0-0.bpo.3-686). Скачал сорсы, взял /boot/config-4.9.0-0.bpo.3-686, пересобрал ядро с текущим конфигом. Результат тот же.
может в коде что не так? Хотя что в хелловрде может быть не так?

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

static int __init mod_init(void)
{
    printk("Hello, world!\n");
    return 0;
}

static void __exit mod_exit(void)
{
    printk(KERN_ALERT "Goodbye!\n");
}

module_init(mod_init);
module_exit(mod_exit);


Я пока еще полон решимости, но не знаю надолго ли
Re[3]: создание модуля ядра linux
От: aik Австралия  
Дата: 06.06.17 11:25
Оценка: +2
Здравствуйте, plastictown, Вы писали:

P>Я поставил ядро посвежее (4.9.0-0.bpo.3-686). Скачал сорсы, взял /boot/config-4.9.0-0.bpo.3-686, пересобрал ядро с текущим конфигом. Результат тот же.


Ты грузи собранное тобою же ядро, потому что собранное тобой может иметь другую полную версию — "uname -r" на машине и "make kernelrelease" должны показывать строго одно и то же.

P>может в коде что не так? Хотя что в хелловрде может быть не так?


Обычно еще надо такое:
MODULE_VERSION(DRIVER_VERSION); 
MODULE_LICENSE("GPL v2");       
MODULE_AUTHOR(DRIVER_AUTHOR);   
MODULE_DESCRIPTION(DRIVER_DESC);


Ну, как минимум, MODULE_LICENSE — ядро проверяет что оно грузит, оно же и dmesg или /var/log/syslog (или messages?) ругается что именно не так. selinux может гадить, наверное, его можно вырубить. CONFIG_MODVERSIONS и CONFIG_MODULE_SRCVERSION_ALL еще можно отключить пока экспериментируешь.
Re[3]: создание модуля ядра linux
От: kov_serg Россия  
Дата: 06.06.17 11:26
Оценка:
Здравствуйте, plastictown, Вы писали:

P>Шел третий день...

P>Я поставил ядро посвежее (4.9.0-0.bpo.3-686). Скачал сорсы, взял /boot/config-4.9.0-0.bpo.3-686, пересобрал ядро с текущим конфигом. Результат тот же.
P>может в коде что не так? Хотя что в хелловрде может быть не так?

P>Я пока еще полон решимости, но не знаю надолго ли


modinfo что пишет в поле vermagic?
совпадает ли оно с модулями что уже загружены?

Если нет то правте прямо в include/linux/vermagic.h
Re[4]: создание модуля ядра linux
От: plastictown Норвегия  
Дата: 06.06.17 11:58
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>modinfo что пишет в поле vermagic?



_>Если нет то правте прямо в include/linux/vermagic.h


После третьей перекомпиляции ядра модуль все-таки стал на место. В dmesg есть сообщения от модуля при insmod и при rmmod.
Но:

vermagic: 4.9.25 SMP mod_unload modversions 686
make kernelrelease: 4.9.25
uname -r: 4.9.0-0.bpo.3-686

Не совсем совпадает. Это нормально?
Re[5]: создание модуля ядра linux
От: aik Австралия  
Дата: 06.06.17 12:34
Оценка:
Здравствуйте, plastictown, Вы писали:

P>vermagic: 4.9.25 SMP mod_unload modversions 686

P>make kernelrelease: 4.9.25
P>uname -r: 4.9.0-0.bpo.3-686
P>Не совсем совпадает. Это нормально?

Не, не очень, запущено не твое ядро, хотя твой модуль и загрузился в него.
Re[6]: создание модуля ядра linux
От: plastictown Норвегия  
Дата: 07.06.17 22:44
Оценка:
У меня образовался оффтопик неожиданно. Вопрос избитый, однако в моем случае имеются отличия от общей картины. Речь о драйвере nvidia возможно, а может и не о нем совсем. Перво-наперво я решил опробовать rt ядро. Все через синаптик в основном, после перезагрузки само собой икс-сервер полетел, потому что по-другому не бывает, вероятно Я удалил все, что включало nvidia, nouveau, xserver-xorg, поставил xserver-xorg и xserver-xorg-video-nvidia. Проблема в том, что я не могу залогиниться в графическом режиме. В консоли все ОК. Ставил родной драйвер — та же ерунда. Чего делать не знаю. 10 часов просидел уже, зашел в винду отдышаться и в Интернет сходить. А еще kde переустановил заодно тоже и настройки поудалял. Как-то так
Re[7]: создание модуля ядра linux
От: aik Австралия  
Дата: 08.06.17 02:13
Оценка:
Здравствуйте, plastictown, Вы писали:

P>У меня образовался оффтопик неожиданно. Вопрос избитый, однако в моем случае имеются отличия от общей картины. Речь о драйвере nvidia возможно, а может и не о нем совсем. Перво-наперво я решил опробовать rt ядро. Все через синаптик в основном, после перезагрузки само собой икс-сервер полетел, потому что по-другому не бывает, вероятно Я удалил все, что включало nvidia, nouveau, xserver-xorg, поставил xserver-xorg и xserver-xorg-video-nvidia. Проблема в том, что я не могу залогиниться в графическом режиме. В консоли все ОК. Ставил родной драйвер — та же ерунда. Чего делать не знаю. 10 часов просидел уже, зашел в винду отдышаться и в Интернет сходить. А еще kde переустановил заодно тоже и настройки поудалял. Как-то так


Я с nvidia знаком только шапочно и только с той стороны, которая cuda С этой нвидией надо понимать что есть линуксовый драйвер "nouveau" и драйвер "nvidia" от nVidia. Вместе они работают плохо (хотя и грузятся одновременно) и тебе сначала надо убедиться через lsmod что "nvidia" нету, а только "nouveau". А со стандартным ядром то видео что, тоже нету?
Re[7]: создание модуля ядра linux
От: kov_serg Россия  
Дата: 08.06.17 05:26
Оценка:
Здравствуйте, plastictown, Вы писали:

P>У меня образовался оффтопик неожиданно. Вопрос избитый, однако в моем случае имеются отличия от общей картины. Речь о драйвере nvidia возможно, а может и не о нем совсем. Перво-наперво я решил опробовать rt ядро. Все через синаптик в основном, после перезагрузки само собой икс-сервер полетел, потому что по-другому не бывает, вероятно Я удалил все, что включало nvidia, nouveau, xserver-xorg, поставил xserver-xorg и xserver-xorg-video-nvidia. Проблема в том, что я не могу залогиниться в графическом режиме. В консоли все ОК. Ставил родной драйвер — та же ерунда. Чего делать не знаю. 10 часов просидел уже, зашел в винду отдышаться и в Интернет сходить. А еще kde переустановил заодно тоже и настройки поудалял. Как-то так

Надо просто удалить из черного списка драйвер nouveau. Сечас точно не скажу но точно где-то в /etc/modprobe.d
Искать можно так grep nouveau -R /etc
У меня установка дров nvidia и cuda почти всегда с первога раза не влетает, нужно искать рабоую версию.
Re[8]: создание модуля ядра linux
От: plastictown Норвегия  
Дата: 08.06.17 05:50
Оценка:
Здравствуйте, aik, Вы писали:

aik>Я с nvidia знаком только шапочно и только с той стороны, которая cuda С этой нвидией надо понимать что есть линуксовый драйвер "nouveau" и драйвер "nvidia" от nVidia. Вместе они работают плохо (хотя и грузятся одновременно) и тебе сначала надо убедиться через lsmod что "nvidia" нету, а только "nouveau". А со стандартным ядром то видео что, тоже нету?


Я вроде бы их одновременно не ставил ни разу. Одно удаляю, другое ставлю. Так в том-то и проблема, что иксы запускаются, потом форма логина, имя, пароль, ОК, потом экран моргает и обратно появляется форма логина.
Re[9]: создание модуля ядра linux
От: aik Австралия  
Дата: 08.06.17 06:01
Оценка:
Здравствуйте, plastictown, Вы писали:

aik>>Я с nvidia знаком только шапочно и только с той стороны, которая cuda С этой нвидией надо понимать что есть линуксовый драйвер "nouveau" и драйвер "nvidia" от nVidia. Вместе они работают плохо (хотя и грузятся одновременно) и тебе сначала надо убедиться через lsmod что "nvidia" нету, а только "nouveau". А со стандартным ядром то видео что, тоже нету?

P>Я вроде бы их одновременно не ставил ни разу. Одно удаляю, другое ставлю.

"Ставятся" драйвера от nVidia, а nouveau компилится с ядром и чтоб от него избавиться — его надо выпилить из конфига или переместить nouveau*.ko из /lib/modules/<твоеядро>/....

P>Так в том-то и проблема, что иксы запускаются, потом форма логина, имя, пароль, ОК, потом экран моргает и обратно появляется форма логина.


Ух ты ж. Тут больше похоже на сломанный профиль, у меня так было когда я гнома не запускал года 2 (сидел и сижу в mate), а потом попробовал — и выглядело ровно так же. Заведи нового юзера и попробуй залогиниться под ним.
Re[10]: создание модуля ядра linux
От: plastictown Норвегия  
Дата: 08.06.17 09:53
Оценка:
Здравствуйте, aik, Вы писали:

aik>Ух ты ж. Тут больше похоже на сломанный профиль, у меня так было когда я гнома не запускал года 2 (сидел и сижу в mate), а потом попробовал — и выглядело ровно так же. Заведи нового юзера и попробуй залогиниться под ним.


Может быть тогда подскажете как корректно установить mate после kde, чтобы он нормально запустился? Надо будет сегодня посносить все десктопы нафиг, остафить один. Или mate или cinnamon. Да. Так и сделаю
Re[11]: создание модуля ядра linux
От: aik Австралия  
Дата: 08.06.17 11:45
Оценка:
Здравствуйте, plastictown, Вы писали:

P>Может быть тогда подскажете как корректно установить mate после kde, чтобы он нормально запустился? Надо будет сегодня посносить все десктопы нафиг, остафить один. Или mate или cinnamon. Да. Так и сделаю


Да нет никакого "корректно", просто ставишь из пакетов, типа "apt-get install mate" или типа того и всех делов. Ты лучше скажи что произошло когда ты зашел под новым юзером.
Re[12]: создание модуля ядра linux
От: plastictown Норвегия  
Дата: 08.06.17 11:50
Оценка:
Здравствуйте, aik, Вы писали:

aik> Ты лучше скажи что произошло когда ты зашел под новым юзером.


Буду дома отпишусь.
Re[12]: создание модуля ядра linux
От: plastictown Норвегия  
Дата: 08.06.17 22:41
Оценка:
Здравствуйте, aik, Вы писали:

aik>Да нет никакого "корректно", просто ставишь из пакетов, типа "apt-get install mate" или типа того и всех делов. Ты лучше скажи что произошло когда ты зашел под новым юзером.


Короче. все закончилось печально. Создание нового юзера никак не повлияло на ситуацию, и я решил, что если я буду бороться сутками с системой, то до написания кода дело не дойдет. Все снес и поставил минт. Зато испытал всю мощь Links2 и growisofs, mc тоже. Начинаю сомневаться в необходимости запуска икса вообще Того и гляди начну в vi код писать
Re[2]: создание модуля ядра linux
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.07.17 04:13
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>ядро и модуль должны быть собраны из одних и тех же исходников, с одним и тем же конфигом.


Интересно, когда уже в линуксе придут к пониманию удобства динамического связывания даже на уровне ядра? Для этого совершенно не нужно раздувать ядро статически — достаточно сделать один модуль для загрузки модулей с нераскрытыми при линковке ссылками, и один модуль для поиска адресов по именам.
Re[3]: создание модуля ядра linux
От: aik Австралия  
Дата: 04.07.17 05:16
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

Z>>ядро и модуль должны быть собраны из одних и тех же исходников, с одним и тем же конфигом.

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

Так динамическое связывание и работает, давно (всегда?). Людям не нравятся дополнительные проверки версий модулей и ядра, кому они очень мешают — выключают CONFIG_MODULE_SRCVERSION_ALL и вперед грузить что попало. Только в линуксе гораздо проще пересобрать и поставить своё ядро, чем грузить в него что попало с риском за-taint'ить, это по большому счету нужно распространителям низкокачественных бинарных драйверов типа nvidia (чтоб никто не видел какой же это лютый хлам внутри).
Re[4]: создание модуля ядра linux
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.07.17 06:13
Оценка: -1
Здравствуйте, aik, Вы писали:

aik>Так динамическое связывание и работает, давно (всегда?).


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

aik>Людям не нравятся дополнительные проверки версий модулей и ядра, кому они очень мешают — выключают CONFIG_MODULE_SRCVERSION_ALL и вперед грузить что попало.


А для чего нужны эти проверки? Умный модуль сам должен проверять версию ядра, наличие в нем нужного функционала, и получать нужные точки входа, интерфейсы и т.п.

aik>Только в линуксе гораздо проще пересобрать и поставить своё ядро


Собрать/пересобрать ядро, копаться в конфигах и т.п. проще разработчику или опытному сисадмину. Обычному юзеру это и неудобно, и зачастую сложно — он хотел бы просто скачать готовый модуль (как правило, это драйвер устройства), загрузить, и сразу же получить работающее устройство, как это делается в той же винде. А так в репозиториях дистрибутивов всегда есть драйверы для ширпотреба, но стоит приобрести что-то не особо ходовое, как начинаются пляски с бубном.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.