免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1194 | 回复: 0
打印 上一主题 下一主题

在linux2.6下如何利用交叉编译工具编译内核模块 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-16 15:04 |只看该作者 |倒序浏览
文档介绍:
    此文档用来说明如何构建自己的内核模块以及如何在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生成自己的根文件系统。

转    arm-linux2.6 交叉编译环境的建立
本人使用的HOST : redhat 9.0 + gcc.3.2.2
这种方法是将两个版本的交叉编译环境进行取舍,合并成一个你所需要的版本, 在网络上有很多toolchain,未必能够满足你的实际需要,只好自己改一改。
下面的是我在编译linux-2.6.0.tar.gz + patch-2.6.0-rmk2.gz 是用的toolchain . 我将原来的两个版本的toolchain 作了如下操作,得到新的toolchain :
1.首先在
http://handhelds.org/download/toolchain/arm-linux-gcc-3.3.2.tar.bz2
下载 arm-gcc 3.3.2
2.将arm-linux-gcc-3.3.2.tar.bz2 解压到 /toolchain
# tar jxvf arm-linux-gcc-3.3.2.tar.bz2
# mv /usr/local/arm/3.3.2 /toolchain
3. 在
http://handhelds.org/download/toolchain/arm-linux-toolchain-post-2.2.13.tar.gz
下载arm-linux-toolchain-post-2.2.13.tar.gz (其实我只是用了它的头文件而已,大家可以根据需要定制头文件,主要来自内核/linux-x.x/include下)
4. 将arm-linux-toolchain-post-2.2.13.tar.gz 解压到 /skiff/local/ 下
# tar zxvf arm-linux-toolchain-post-2.2.13.tar.gz
5. 拷贝头文件到/toolchain/arm-linux/ 下. 然后删除 /skiff
# cp -dR /skiff/local/arm-linux/include /toolchain/arm-linux/
# rm -fr /skiff
6. ok! arm linux 2.6 的交叉编译环境建立好了! /toolchain/bin/arm-linux-
各位好运!

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/50410/showart_497604.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP