Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4244574
  • 博文数量: 776
  • 博客积分: 13014
  • 博客等级: 上将
  • 技术积分: 10391
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-22 17:00
文章分类

全部博文(776)

文章存档

2015年(55)

2014年(43)

2013年(147)

2012年(20)

2011年(82)

2010年(429)

分类: LINUX

2010-02-22 19:57:09

linux2.4与2.6下的模块编程对比

模块编程在2.4和2.6的kernel中的区别
以hello world为例:
2.4:

========================
hello.c
========================
/* How to compile:
* gcc -I /usr/src/linux-2.4/include -DMODULE -D__KERNEL__ -c hello.c
*/
#ifndef MODULE
#define MODULE
#endif
#ifndef __KERNEL__
#define __KERNEL__
#endif
#include
#include
int init_module(void)

{
printk(KERN_ALERT "Hello World!\n");
return 0; // Must return 0!
}
void cleanup_module(void)

{
printk(KERN_ALERT "Goodbye world!\n");
}
MODULE_LICENSE("GPL"); // Avoid "no license" warning.
========================

Makefile
========================
CC=gcc
MODCFLAGS := -I /usr/src/linux-2.4/include -DMODULE -D__KERNEL__
hello.o:hello.c

$(CC) $(MODCFLAGS) -c hello.c
.PHONY:clean
clean:

rm -f hello.o
========================
# make

# insmod hello.o
# lsmod
# rmmod hello
注:2.4的模块编程中,MODULE和__KERNEL__这两个宏必须要定义,不管你是在编译时定义还是写在源文件里。我这里是两边都写了,不过加了保护,不会出现重复定义,也不会忘记定义。linux/kernel.h这个文件中,定义了KERN_ALERT这个宏,如果你直接改写成"<1>",就可以不用包含这个头文件。而linux/module.h是模块编译必须的头文件,不可以省略。


2.6:
========================
hello.c
========================
#include
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static char *whom = "world";

module_param(whom, charp, 0);
static int howmany = 1;
module_param(howmany, int, 0);
static int hello_init(void)

{
int i;
for( i=0; i  printk(KERN_ALERT "(%d) Hello, %s!\n",i,whom);
return 0;
}
static void hello_exit(void)

{
printk(KERN_ALERT "Goodbye!\n");
}
module_init(hello_init);

module_exit(hello_exit);
========================

Makefile
========================
obj-m += hello.o
all:

make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
========================
# make

# insmod hello.ko
或者
# insmod hello.ko howmany=2 whom=linux
# lsmod
# rmmod hello

注:在2.6中,初始化函数和收尾函数可以写成任何名字,只要在源文件中分别用module_init()和module_exit()宏调用一下就可以了,其实本质还是init_module()和cleanup_module()函数,这点你可以在/lib/modules/$(shell uname -r)/build/include/linux/init.h中看到。而在moduleparam.h中则是关于参数调用的内容。

 

阅读(953) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~