打印

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

[复制链接]
1270|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flycat2008|  楼主 | 2008-7-31 12:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

模块编程在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 <linux/kernel.h>
#include <linux/module.h> 

int init_module(void)


{
 printk(KERN_ALERT "Hello World! ");
 return 0; // Must return 0!


void cleanup_module(void)


{
 printk(KERN_ALERT "Goodbye world! ");


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 <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
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<howmany; i++)
  printk(KERN_ALERT "(%d) Hello, %s! ",i,whom);
 return 0;


static void hello_exit(void)


{
 printk(KERN_ALERT "Goodbye! ");


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里看到响应的消息记录。

本**来自中国IT实验室http://embed.chinaitlab.com/

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

103

帖子

0

粉丝