现在的位置: 首页 > 综合 > 正文

成功编译Linux设备驱动中的HelloWorld!

2013年08月26日 ⁄ 综合 ⁄ 共 2235字 ⁄ 字号 评论关闭
成功编译Linux设备驱动中的HelloWorld!


刚刚接触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     编译内核
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. 编写内核模块源文件:

//hello.c
#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_init(hello_init);
module_exit(hello_exit);

12. 编写Makefile:

# Makefile
obj-m:
=hello.o
KDIR:
=/lib/modules/$(shell uname -r)/build
PWD:
=$(shell pwd)
default:
   
$(make) -C $(KDIR) M=$(PWD) modules

千万注意:$(make)前面一定需要用tab键空格,否则会出现nothing to do的情况!

13. 执行make命令进行编译就行了, 执行完毕后,会生成几个文件:
hello.ko
hello.mod.c
hello.mod.o
hello.o

14. 运行命令:
# insmod hello.ko
应该可以看到返回的信息:Hello world
然后再运行命令:
# rmmod hello
应该可以看到返回的信息:Goodbye
如果没看到,就是输出到系统的日志文件中去了,可以查看文件:/var/log/messages

问题分析:
1. insmod 时出现 "Invalid module format"
答案:编译目标不同,比如编译的是i686,装好的是i386,回顾一下步骤4 --target=i386,因此如果出现这个错误的话需要选择正确的编译目标重新编译了!
2. make时显示make: Nothing to be done for `default'.
答案:请看步骤12的Note!

抱歉!评论已关闭.