Chinaunix首页 | 论坛 | 博客
  • 博客访问: 658970
  • 博文数量: 139
  • 博客积分: 2655
  • 博客等级: 少校
  • 技术积分: 1723
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-02 16:03
文章分类

全部博文(139)

文章存档

2013年(2)

2011年(17)

2010年(14)

2009年(86)

2008年(20)

分类:

2009-08-30 17:41:17

关于内核模块的编译,今天看书时又遇到,2.4和2.6在模块入口和编译方面不太一样!整理下

1).对于2.4:
// helloworld.c for kernel 2.4
#define MODULE
#include

//模块入口
int init_module(void)
{
  printk("<1> Hello World\n");
}
//模块出口
void cleanup_module(void)
{
  printk("<1> GoodBye\n");
}

然后gcc -c helloword.c

2).对于2.6:
#include
#include
#include
MODULE_LICENSE("GPL");
//MODULE_LICENSE("Dual BSD/GPL");

static char *whom = "world";
module_param(whom, charp, 0);//charp为指针参数类型
static int howmany = 1;
module_param(howmany, int, 0);

static int hello_init(void)
{
 int i;
 for( i=0; i /*
printk() 声明都会带一个优先级,就像你看到的KERN_ALERT 那样。内核总共定义了八个优先级的宏, 所以你不必使用晦涩的数字代码,并且你可以从文件 linux/kernel.h查看这些宏和它们的意义。如果你 不指明优先级,默认的优先级DEFAULT_MESSAGE_LOGLEVEL将被采用。八个优先级分别是(使用宏定义和使用<数字>效果一样)
KERN_EMERG <0>
KERN_ALERT <1>
KERN_CRIT <2>
KERN_ERR <3>
KERN_WARNING <4>
KERN_NOTICE <5>
KERN_INFO <6>
KERN_DEBUG <7>
*/
  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);
//below 3 line are added by me!
MODULE_AUTHOR("wzgyantai");
MODULE_DESCRIPTION("a simple module");
MODULE_ALIAS("helloworld");


一般写成Makefile:
mymodule-objs := file1.o file2.o ... 表示mymoudule.o file1.ofile2.o 等连接生成
obj-m := helloworld.o #表示编译连接后将生成helloworld.o
KERNELBUILD := /lib/modules/`uname -r`/build
default:
        #以下两种都可以!
        #-C change to directory dir before reading the makefiles or doing anything else.指定build的目录,因为在编译的时候会用到该目录下的文件. 还可以定义内核头文件所在位置(KERNELHEAD)。 M=表示这是个外部模块,M=$(PWD) 指定了该模块文件所在的路径
        #make -C $(KERNELBUILD) M=$(shell pwd) modules
        #Fedora10在/lib/module下和/usr/src/kernels有相同的目录含有这里所需的文件
        make -C /usr/src/kernels/`uname -r` M=$(PWD) modules
   
clean:
        rm -rf *.o .*.cmd *.ko *.mod.c .tmp_versions

编译之后在M=$(PWD)所在目录生成
helloworld.c       helloworld.mod.c  helloworld.o    modules.order
helloworld.ko  helloworld.mod.o  Makefile      Module.markers  Module.symvers

安装:insmod helloworld.ko 然后查看dmesg|less,
卸载:rmmod helloworld 然后再查看dmesg|less
其实也可通过lsmod|grep helloworld 或者less /proc/kallsyms查看

Reference:
http://blog.csdn.net/itismine/archive/2009/05/03/4145191.aspx
http://wzgyantai.blogbus.com/logs/27534846.html

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