如何构建Linux模块
http://blog.sina.com.cn/s/blog_520ff7d50100k30u.html 原文
Sourcecode:
Hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
}
static void hello_exit(void)
{
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
obj-m :=hello.o
K_DIR = $(shell uname -r)
PWD = $(shell pwd)
all:
clean:
如果模块有多个文件,可以这样写
obj-m :=scull.o
scull-objs := main.o pipe.o access.o
将生成scull.ko模块
模块安装:insmod hello.ko
显示已装载的模块:lsmod
模块卸载:rmmod hello
编译环境fedro9 kernel 2.6.25-14.fc9.i686
安装内核源码包:
rpm –Uvh kernel-2.6.25-14.fc9.i686.src.rpm
这个命令将 RPM 内容写到路径 /usr/src/redhat/SOURCE
我把代码2.6.25解到/usr/src/kernels/2.6.25-14.fc9.i686下,这和我的模块编译用的Makefile有关。
可能遇到的问题
1.出现很多编译错误
到kernel所在目录执行make prepare/ make config,这是没有配置好源码树的原因。可能还需要KBUILD
2.错误提示: /bin/sh: scripts/mod/modpost: No such file ordirectory
出现这样的错误,说明scripts下没有生成相应的文件MODPOST,cd到kernel所在目录,执行: makescripts
3.安装时失败,提示invalid moduleformat,多是因为编译依据的内核与操作系统不一致(装载时会做很多检查,比如是否支持SMP,这些都是通过makeconfig设置的,也可以将/boot/config-2.6.25-14.fc9.i686拷贝到内核源代码目录下如/usr/src/kernels/2.6.25-14.fc9.i686),首先要保证内核与操作系统一致。
然后,需要修改kernel源代码根目录下的Makefile
EXTRAVERSION = -14.fc9.i686 (这个值根据uname –r的返回结果修改,我的为2.6.25-14.fc9.i686)
4.如果没有看到打印信息可以到文件/var/log/messages中去找