linux 2.4 2.6 区别,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中则是关于参数调用的内容。

P.S.

KERN_EMERG <0>

KERN_ALERT <1>

KERN_CRIT <2>

KERN_ERR <3>

KERN_WARNING <4>

KERN_NOTICE <5>

KERN_INFO <6>

KERN_DEBUG <7>

如果要想看到hello world的打印消息,必须切换到字符模式下,在x-window中的控制台中是收不到消息的,但是可以在/var/log/messages里看到响应的消息记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值