Skip to contentSkip to conversation

Inserting a module (2.6 kernel)

DISCUSSION Andi Kleen 2 participants 2 messages Jun 9, 2004 – Jun 12, 2004 1 message not in the archive

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

Andi Kleen

author
#1 lore raw
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

#2 lore raw
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