Chinaunix首页 | 论坛 | 博客
  • 博客访问: 397395
  • 博文数量: 115
  • 博客积分: 2501
  • 博客等级: 少校
  • 技术积分: 1009
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-23 17:05
文章分类

全部博文(115)

文章存档

2011年(2)

2010年(86)

2009年(27)

我的朋友

分类: LINUX

2009-10-09 21:46:34

How to compile kernel modules for the kernel 2.6

HOWTO compile kernel modules for the kernel 2.6:

 

 

If you want to compile the sum-module (source mirrored below), follow these steps:

 

Create the Makefile in your directory with the sum-module.c

 

 

obj-m    := sum-module.o

 

KDIR    := /lib/modules/$(shell uname -r)/build

PWD    := $(shell pwd)

 

default:

       $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

 

Now do a

 

make

 

... and the sum-module.ko is built.

 

If you get something like this

# make

make: Nothing to be done for `default'.

 

you need to install the kernel source and compile the kernel first (run "make" at least to the point until all "HOSTCC scripts/" stuff is done - this will configure your kernel and allows external module compilation). Make sure /lib/modules/$(shell uname -r)/build points to your build directory (most likely /usr/src/linux...).

Another reason for the above error can be, that your browser converted the TAB before $(MAKE) to spaces. Make sure there is a TAB before $(MAKE).

 

 

 

Install it with install.sh:

 

#!/bin/sh

install -m 644 sum-module.ko /lib/modules/`uname -r`/kernel/drivers/sum-module.ko

/sbin/depmod -a

 

(adjust the /lib/modules path according to your needs)

 

Now make a

# modprobe sum-module

 

 

Or if you don't want to install the module, do this:

# insmod ./sum-module.ko

 

 

..and if your system doesn't freeze you've done it right ;-)

 

For kernel 2.4, the Makefile would look like this:

TARGET       := modulename

INCLUDE    := -I/lib/modules/`uname -r`/build/include

CFLAGS      := -O2 -Wall -DMODULE -D__KERNEL__ -DLINUX

CC  := gcc

 

${TARGET}.o: ${TARGET}.c

       $(CC) $(CFLAGS) ${INCLUDE} -c ${TARGET}.c

 

(not yet tested)

 

 

 

sum-module source from: ~aeb/linux/lk/lk-9.html

 

 

/*

 * sum-module.c

# modprobe sum-module.o

# ls -l /proc/arith

total 0

dr-xr-xr-x    2 root     root            0 Sep 30 12:40 .

dr-xr-xr-x   89 root     root            0 Sep 30 12:39 ..

-r--r--r--    1 root     root            0 Sep 30 12:40 sum

# cat /proc/arith/sum

0

# echo 7 > /proc/arith/sum

# echo 5 > /proc/arith/sum

# echo 13 > /proc/arith/sum

# cat /proc/arith/sum

25

# rmmod sum-module

# ls -l /proc/arith

ls: /proc/arith: No such file or directory

#

*/

 

#include

#include

#include

#include

 

 

static unsigned long long sum;

 

static int show_sum(char *buffer, char **start, off_t offset, int length) {

        int size;

 

        size = sprintf(buffer, "%lld\n", sum);

        *start = buffer + offset;

        size -= offset;

        return (size > length) ? length : (size > 0) ? size : 0;

}

 

/* Expect decimal number of at most 9 digits followed by '\n' */

static int add_to_sum(struct file *file, const char *buffer,

                      unsigned long count, void *data) {

        unsigned long val = 0;

        char buf[10];

        char *endp;

 

        if (count > sizeof(buf))

                return -EINVAL;

        if (copy_from_user(buf, buffer, count))

                return -EFAULT;

        val = simple_strtoul(buf, &endp, 10);

        if (*endp != '\n')

                return -EINVAL;

        sum += val;     /* mod 2^64 */

        return count;

}

 

static int __init sum_init(void) {

        struct proc_dir_entry *proc_arith;

        struct proc_dir_entry *proc_arith_sum;

 

        proc_arith = proc_mkdir("arith", 0);

        if (!proc_arith) {

                printk (KERN_ERR "cannot create /proc/arith\n");

                return -ENOMEM;

        }

        proc_arith_sum = create_proc_info_entry("arith/sum", 0, 0, show_sum);

        if (!proc_arith_sum) {

                printk (KERN_ERR "cannot create /proc/arith/sum\n");

                remove_proc_entry("arith", 0);

                return -ENOMEM;

        }

        proc_arith_sum->write_proc = add_to_sum;

        return 0;

}

 

static void __exit sum_exit(void) {

        remove_proc_entry("arith/sum", 0);

        remove_proc_entry("arith", 0);

}

 

module_init(sum_init);

module_exit(sum_exit);

MODULE_LICENSE("GPL");

阅读(561) | 评论(0) | 转发(0) |
0

上一篇:修复GRUB

下一篇:Linux下C语言历遍目录

给主人留下些什么吧!~~