嵌入式爱好者

查看: 4944|回复: 3

内核模块加载问题

[复制链接]
zhlidoudou 该用户已被删除
发表于 2012-4-15 20:04:25 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

0

主题

1836

帖子

1028

积分

发表于 2012-4-16 09:22:02 | 显示全部楼层
本帖最后由 飞凌-develop 于 2012-4-16 09:27 编辑

早上7点,就被窗外一群敲锣打鼓的响声吵醒了,今天可是星期天啊,没法睡了,起来做点有意义的吧。
昨天在OK6410开发板上折腾了一下午,才正常把内核模块的编译和运行搞定,现在整理一下过程,待以后有个参考。
什么事情实际做起来总会比想象的复杂,特别是一开始,本来是很简单的一段代码如下:
#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("David Xie");
MODULE_DESCRIPTION("Hello World Module");
MODULE_ALIAS("a simplest module");
static int __init hello_init()
{
    printk(KERN_EMERG"Hello World!\n");
    return 0;
}
static void __exit hello_exit()
{
    printk(KERN_EMERG "Goodbye Cruel World!\n");
}
module_init(hello_init);
module_exit(hello_exit);
第一步当然是编译了,遇到第一个问题:要在6410上运行该内核模块,如何设置交叉编译器?首先想到的是makefile,打开makefile文件,如下:
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KDIR := /forlinux/kernel/linux-2.6.28
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
首先需要指定kernel的源代码路径:
KDIR := /forlinux/kernel/linux-2.6.28
这个路径由自己决定,移植的arm平台下的linux源代码放在什么地方就填什么路径,如果指定错误的话,会提示找不到下面两个文件的。
#include <linux/module.h>
#include <linux/init.h>

然后指定交叉编译器,CROSS_COMPILE=/usr/loacl/arm/4.2.2-eabi/usr/bin/arm-linux-
同样这个路径也是自己决定,放在哪个目录就填哪个目录。
makefile主要修改这两个地方就OK了,保存关闭。
在控制台命令下,进入hello.c目录,先make clean一下,再make,可以看到hello.ko内核模块生成了,将它拷贝到ok6410板上:
insmod hello.ko
可以看到hello world打印信息,但是在rmmod的时候,确无法卸载,google了一把,需要在linux源码目录下,执行make prepare一下,修复bounds.h文件。
再rmmod hello
Goodbye Cruel World!

0

主题

1836

帖子

1028

积分

发表于 2012-4-16 09:24:38 | 显示全部楼层
网友的总结,链接地址:http://avrgroup.5d6d.com/archiver/tid-6614.html,希望能帮助楼主解决问题。
suhacen 该用户已被删除
发表于 2013-3-7 21:43:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
点评回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-12-23 15:09

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表