Здравствуйте. Целый день провозился с попыткой загрузить свой модуль в ядро. На обычном линуксе все компилируется и работает в ядре.
Процессор 9g45. Проблема в том, что собирается модуль с архитектурой хост машины, а я не могу разобраться в том, как подсунуть заголовки нужного мне (2.6.36) ядра, чувствую, что надо копать в сторону Makefile, но опыта не хватает.
спасибо, у меня в принципе такой makefile.
но пока скомпилировать не получается. проблема, как я понимаю, в том, что компилятор берет файлы для архитектуры х86. Пробовал выставлять переменную среды CC=arm-unknown-linux-gnueabi-gcc, пробовал make ARCH=arm, но увы, одиночные файлы компилируются нормально, а вот со сборкой пока не выходит. что еще можно предпринять?
Уважаемый sasamy, спасибо еще раз ваше терпение. Стыдно за себя, за свою лень( эпоха интернета очень сильно расхолаживает(
была проблема с vermagic (ядро платы 36-rc6, я скачал просто 36) - вроде удалось решить, изменив Makefile ядра (параметр EXTRAVERSION)
все компилируется, команда file рапортует LSB relocatable, ARM, version 1, not stripped.
но при попытке установить (insmod) модуль вижу oops 17 unable to handle NULL pointer dereference to address 00000000
причем я пробовал и ваш драйвер, и с хабра (он на большом линуксе работал точно).
вроде из-за различий версий ядра такого быть не должно.
в какую сторону можно посмотреть?
Надо смотреть драйвер - при загрузке динамических модулей есть один важный момент - в ядре уже нет кода инициализации, вы наверно видели в логе загрузки ядра что-то подобное
Freeing init memory: 132K
ф-ции помеченные макросами __init и данные __initdata - размещаются в специальном сегменте памяти который освобождается после загрузки ядра, поэтому если при ините модуля вызываются подобные внешние по отношению к модулю ф-ции то это сработает при статической линковке и не сработает при динамической загрузке модуля.
я своим неопытным взглядом вижу, что остановка произошла в функции mod_sysfs_setup() и что произошел выход стека за выделенные пределы. значит ли это, что проблема происходит при попытке ядра создать файл модуля в sysfs?
У вас есть исходники ядра 2.6.36-rc6 - ядро должно быть сконфигурировано с поддержкой динамических модулей
[*] Enable loadable module support --->
и собрано. Поменяйте в моем примере путь к исходникам этого ядра и оставьте в модуле только то что вы тут написали и соберите скриптом build.sh - должно все работать.
попробовал тут такой код
#include <module.h> // определения для модуля
#include <init.h> // module_init и module_exit
#include <kernel.h> // printk
MODULE_AUTHOR("Mike Goblin mgoblin@mail.ru");
MODULE_DESCRIPTION("Test module for linux kernel");
int module_start()
{
printk("This is a test module startup message\n");
return 0;
}
void module_stop()
{
printk("Module is dead\n");
return;
}
module_init(module_start);
module_exit(module_stop);
немного подправил инклюды, лизенцию прописал, при компиляции были варнинги, что функции не соотвествуют прототипу, на целевой машине при установке сообщается, что invalid module format.
где же счастье-то драйверное...?)))