Inserting a module (2.6 kernel)
A message that is not in the archive (sent off-list or not yet received): [email protected]
Quoted 12 lines · Steve Hemond
Hi people,
I am new to kernel module writing and I base myself on the Linux Device Drivers book from O'reilly. I have written this simple module :
#include <
linux/module.h>int
init_module(void)
{
printk("<1>Module inserted\n");
return 0;
}
Quoted 5 lines
void
cleanup_module(void)
{
printk("<1>Module removed\n");
}
For some reason that's probably far too complicated for my little brain it's getting more and more complicated to write custom modules for 2.6.
Compile all with:
gcc -O2 -c hello.c -I /path/to/kernel/include
or
gcc -O2 -mcmodel=kernel -mno-red-zone -c hello.c -I /path/to/kernel/include if you're using x86-64.
In 2.4 what worked was:
#define MODULE 1
#define __KERNEL__ 1
#include <linux/module.h>
int init_module(void)
{
printk("Hello world\n");
return 0;
}Then in 2.6 it needed
#define MODULE 1
#define __KERNEL__ 1
#define KBUILD_MODNAME "hello"
#include <linux/module.h>
int init_module(void)
{
printk("Hello world\n");
return 0;
}Now since 2.6.5 or so it needs:
/* MODULE is not needed anymore */
#define __KERNEL__1
#include <linux/module.h>
int init_module(void)
{
printk("Hello world\n");
return 0;
}struct module __this_module __attribute__((section(".gnu.linkonce.this_module"))) = {
.name = "hello",
.init = init_module,
};
I'm sure there will be more surprises in the future. Keep tuned.
-Andi
Quoted 13 lines · Andi Kleen
Now since 2.6.5 or so it needs:
/* MODULE is not needed anymore */
#define__KERNEL__1
#include <linux/module.h>int
init_module(void){ printk("Hello world\n"); return 0; }
Quoted 5 lines
struct module
__this_module__attribute__((section(".gnu.linkonce.this_module"))) = {
.name = "hello",
.init =init_module,
};
Most of the glue above can be deleted if you just accept to use kbuild when building modules.
So to compile your module use a simple Makefile:
obj-m := mymodule.o
Then to compile the module use:
make -C path/to/kernel/src M=pwd
And to install it use:
make -C path/to/kernel/src M=pwd modules_install
And to clean up in the directory where the module is being compiled:
make -C path/to/kernel/src M=pwd clean
Sam