刚刚接触Linux Device Driver 开发,糊里糊涂弄了几天,终于把HelloWorld Demo编译过了!Tricky!!!! 废话少说,进入主题!
下面就是如何在FC7中搭建环境并编译HelloWorld的过程:
1、我们要先下载FC7 kernel的源代码rpm包, cat /proc/version, 如果显示Linux version 2.6.21-1.3194.fc7...,我们需要下载kernel-2.6.21-1.3194.fc7.src.rpm包,记得是src包,不要下错了!
2、下载完该rpm包后,执行命令:rpm -Uvh kernel-2.6.21-1.3194.fc7.src.rpm
Note:这个命令将 RPM 内容写到路径
/usr/src/redhat/SOURSE和/usr/src/redhat/SPECS
3. cd /usr/src/redhat/SPECS
4. rpmbuild -bp --target=i386 kernel-2.6.spec
Note:这个命令将会把内核源码树放到 目录/usr/src/redhat/BUILD/kernel-2.6.21/linux-2.6.21.i386
5. cd /usr/src/redhat/BUILD/kernel-2.6.21/linux-2.6.21.i386
6. make menuconfig
确保已经选择了下面的功能:
Loadable module support --->
[*] Enable loadable module support
[*] Module unloading
[ ] Module versioning support (EXPERIMENTAL)
[*] Automatic kernel module loading
7. 稍微更改一下Makefile:
每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示的值。内核Makefile 的前四行定义了内核的名字。为了保护官方的内核不被破坏,Makefile经过了修改,以生成一个与运行中的内核不同的名字。在一个模块插入运行中的内核前,这个模块必须针对运行中的内核进行编译。为此,您必须编辑内核的
Makefile。
例如,如果 uname -r 返回字符串 2.6.21-1.3194_FC7,就将 EXTRAVERSION 定义从:
EXTRAVERSION = -prep
修改为:
EXTRAVERSION = -1.3194_FC7
8. make bzImage 编译内核 module_init(hello_init); 12. 编写Makefile:
千万注意:$(make)前面一定需要用tab键空格,否则会出现nothing to do的情况! 13. 执行make命令进行编译就行了, 执行完毕后,会生成几个文件: 14. 运行命令: 问题分析:
9. make modules 编译模块
Note:网上许多地方都说需要make modules_install,可是可以不这样的!我们只是搭建环境就足够了,不需要正真安装modules
10. ln -s /usr/src/redhat/BUILD/kernel-2.6.21/linux-2.6.21.i386 /usr/src/kernels/2.6.21-1.3194.fc7-i686
Note:可以使用ls -l /lib/modules/$(uname -r)/build浏览,该链接连接到/usr/src/kernels/2.6.21-1.3194.fc7-i686目录,因此需要产生这样一个目录
11. 编写内核模块源文件:
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void) {
printk(KERN_ALERT "Hello world ");
return 0;
}
static void hello_exit(void) {
printk(KERN_ALERT "Goodbye ");
}
module_exit(hello_exit);
obj-m:=hello.o
KDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
default:
$(make) -C $(KDIR) M=$(PWD) modules
hello.ko
hello.mod.c
hello.mod.o
hello.o
# insmod hello.ko
应该可以看到返回的信息:Hello world
然后再运行命令:
# rmmod hello
应该可以看到返回的信息:Goodbye
如果没看到,就是输出到系统的日志文件中去了,可以查看文件:/var/log/messages
1. insmod 时出现 "Invalid module format"
2. make时显示make: Nothing to be done for `default'.
答案:请看步骤12的Note!