решил написать модуль по статье
http://gazette.linux.ru.net/rus/articles/lkmpg.html#HELLOWOR...
взял пример#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>static int __init hello_2_init(void)
{
printk(KERN_ALERT "Hello, world 2\n");
return 0;
}static void __exit hello_2_exit(void)
{
printk(KERN_ALERT "Goodbye, world 2\n");
}module_init(hello_2_init);
module_exit(hello_2_exit);makefile :
obj-m += src.oи попробовал собрать
make -C /lib/modules/2.6.9-1.667asp/source SUBDIRS=$PWD modulesсобралось даже без варнингов
make: Entering directory `/lib/modules/2.6.9-1.667asp/build'
CC [M] /home/tsolre/work/modules/1/src.o
Building modules, stage 2.
MODPOST
CC /home/tsolre/work/modules/1/src.mod.o
LD [M] /home/tsolre/work/modules/1/src.ko
make: Leaving directory `/lib/modules/2.6.9-1.667asp/build'так же как и в примере но вот при вставке модуля
insmod ./src.ko
выдает вот такое
insmod: error inserting './src.ko': -1 Invalid module format
в чем может быть проблема ?
Вообщета надо указать, при компиляции, что этот код будет выполнятся в ядре и модулем!
Посмотри лучше другую ссылочку
http://www.opennet.me/docs/RUS/lkmpg/И примерчик от туда:
----------------------hello.c------------------------------
#include <linux/kernel.h> /* We're doing kernel work */
#include <linux/module.h> /* Specifically, a module */#if CONFIG_MODVERSIONS==1
#define MODVERSIONS
#include <linux/modversions.h>
#endifint init_module()
{
printk("Hello, world - this is the kernel speaking\n");
return 0;
}void cleanup_module()
{
printk("Short is the life of a kernel module\n");
}
---------------------------------------------------------------------------MakeFile-----------------------------------
CC=gcc
MODCFLAGS := -Wall -DMODULE -D__KERNEL__ -DLINUXhello.o: hello.c /usr/include/linux/version.h
$(CC) $(MODCFLAGS) -c hello.c
-----------------------------------------------------------
Скорее всего проблема в несовпадении версий.
Выполни modinfo. Параметром укажи собраный модуль. Увидишь версию ядра под которую оно собрано.
Теперь смотри версию своего ядра в /proc/version.
Обе версии должны быть идентичны.
Если не совпадает только extraversion (2.6.12.xxx и 2.6.12.yyy), то можно поравить extraversion в Makefile, который лежит в корне исходников ядра.
Потом собери заново. Должно работать.Есть 2-й способ, не правильный:
выполнить modprobe c параметром --force-vermagic.Удачи.