Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1336028
  • 博文数量: 177
  • 博客积分: 3640
  • 博客等级: 中校
  • 技术积分: 1778
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-27 16:51
文章分类

全部博文(177)

文章存档

2014年(1)

2013年(10)

2012年(3)

2011年(163)

分类: LINUX

2011-05-06 15:56:02

此文档用来说明如何构建自己的内核模块以及如何在DBAU1200开发板上运行内核模块。
    在确保DBAU1200开发板上可以正确启动linux内核以及正确挂载根文件系统以后,即可进行下面一步工作,开发内核模块。驱动可以通过内核模块的方式动态的加载到内核中,同时也可以动态的卸载,这种加载驱动的方式可以大大加快驱动的开发周期,而不必要每次修改驱动都要重新编译一次内核。

一个简单的内核模块:

#include
#include
#include

MODULE_******("GPL");

static int hello_init(void)
{
printk(KERN_ALERT "Hello, Linux world!\n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, Linux world!\n");
}

module_init(hello_init);
module_exit(hello_exit);

将其保存为hello.c文件。

然后,编写一个简单的Makefile :
ifneq ($(KERNELRELEASE),)
mymodule-objs := hello.o
obj-m := mymodule.o
else
PWD := $(shell pwd)
KVR ?= $(shell uname -r)
KDIR := /lib/modules/$(KVR)/build
all:
       $(MAKE) -C $(KDIR) M=$(PWD)
clean:
       rm -rf .*.cmd *.o *.mod.c .tmp_versions
endif

注意,在Makefile中,命令行的前面一定要加上一个Tab符,将上述内容保存文件名为Makefile,然后在确保交叉编译工具正确以后,运行make命令编译此内核模块,make的参数如下所示:

make ARCH=mips CROSS_COMPILE=mipsel-unknown-linux-gnu- KDIR=/home/juran/Build_linux/linux2.6/linux-2.6.21.5

其中,ARCH表示的是目标的体系结构,对应于源代码下ARCH/目录下的内容,
CROSS_COMPILE 表示的是交叉编译工具的前缀,
KDIR 指向编译进目标板的linux内核的顶层路径。

make完成以后生成一堆文件,其中,mymodule.ko即是我们所需要的内核模块。

下面,将内核模块mymodule.ko放入根文件系统,采用网络根文件系统的方式或者采用Initramfs将根文件系统编译进内核的方式均可。mymodule.ko可以放在根文件系统下/usr目录之下。

然后,用yamon启动linux内核,挂载根文件系统以后,

#cd usr
#insmod mymodule.ko

就会看见控制台上输出对应的信息了。

注意:根文件系统必须是利用busybox自己制作的,利用和编译内核一样的交叉编译工具来编译busybox,在配置busybox的时候,选上 insmod等命令的相关支持。起初,我用网上下载的根文件系统来insmod,结果显示kernel version mismatch ,这个根文件系统是为2.4的内核制作的,在2.6的内核里面也可以正确的挂载和使用一些命令,但是,在使用insmod这个命令的时候却出现了问题,所以还是建议采用busybox生成自己的根文件系统。
阅读(3808) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~