2009年5月3日星期日

linux 模块编译

一个简单的模块
#define MODULE
#include <linux/module.h>
int init_module(void)
{
printk("<1> Hello World!\n");
return 0;
}
void cleanup_module(void)
{
printk(" <1>Goodbye!\n");
}
开始的时候用gcc -c hello.c
hello.c:2:26: 错误:linux/module.h:没有那个文件或目录
之后编写了一个Makefile文件
obj-m := hello.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD ?= $(shell pwd)
defalult:
make -C ${KERNELDIR} M=${PWD} modules
install:
insmod hello.ko
uninstall:
rmmod hello.ko
clear:
make -C ${KERNELDIR} M=${PWD} clean
之后,用make就可以编译成功了!
加载模块#insmod hello.ko
卸载模块#rmmod hello
查看#tail /var/log/messages当然也可以用dmesg查看!
May 3 22:23:26 localhost kernel: Hello World!
May 3 22:24:11 localhost kernel: <1>Goodbye!
如何不编写Makefile文件也可以编译成功呢?思考中!
lsmod命令
调用lsmod程序将显示当前系统中正在使用的模块信息。实际上这个程序的功能就是读取/proc文件系统中的文件/proc/modules中的信息,其命令格式为:#lsmod
ksyms命令
ksyms这个程序用来显示内核符号和模块符号表的信息。与lsmod相似,它的功能是读取/proc文件系统中的另一个文件/proc/kallsyms

time