hello world 模块编译
2015-08-04 13:39
429 查看
http://blog.csdn.net/wangkaiblog/article/details/7435423
2012-04-07 16:57 772人阅读
评论(0)
收藏
举报
makefilemoduleubuntushelllayoutc
[cpp]
view plaincopy
[cpp]
view plaincopy
1、test.c
[cpp]
view plaincopy
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
printk(KERN_INFO "Hello World enter \n");
}
static int hello_exit(void)
{
printk(KERN_INFO "Hello World exit\n");
}
module_init(hello_init);
module_exit(hello_exit);
2、Makefile
[html]
view plaincopy
obj-m :=test.o
3、在shell 中键入
[cpp]
view plaincopy
make -C /usr/src/linux-3.3.1/linux-3.3.1/ M=~/Documents/test/ <span style="color:#ff0000;">modules</span>
4、在执行时,出现下面错误:
insmod: error inserting './test.ko': -1 Invalid module format
出错信息出现在 /var/log/message 中。
Apr 7 16:27:33 ubuntu kernel: [ 7026.609031] test: disagrees about version of symbol module_layout
而模块的相关信息可以通过 modinfo 来看。
[cpp]
view plaincopy
wangkai@ubuntu:~/Documents/test$ sudo modinfo test.ko
filename: test.ko
license: Dual BSD/GPL
srcversion: A683B0513DFC18A40C79C30
depends:
vermagic: 3.3.1-20120406 SMP mod_unload modversions 68
内核无法加载模块的原因是因为记载版本号的字符串和当前正在运行的内核模块的不一样,这个版本印戳作为一个静态的字符串存在于内核模块中,叫vermagic
真正的原因是由于当前的内核源码和系统版本不相匹配。 当前正在运行的系统的 为ubuntu 10.10的内核。而源码则为 3.3.1的源码。故出错。
5、解决问题的方法 是
[cpp]
view plaincopy
$ make -C /usr/src/linux-headers-2.6.35-22-generic/ M=~/Documents/test/ modules
二、通过写Makefile的方法,使得模块的勾走更加简单。
1、最简单的方法是,把上面的命令写进Makefile中即可。
[cpp]
view plaincopy
obj-m :=test.o
kernel_modules:
make -C /usr/src/linux-headers-2.6.35-22-generic/ M=/home/wangkai/Documents/test/ modules
clean:
make -C /usr/src/linux-headers-2.6.35-22-generic/ M=/home/wangkai/Documents/test/ clean
2、但是这种方式,不够通用,可以写得更加通用些。
[cpp]
view plaincopy
KVER = $(shell uname -r)
obj-m :=test.o
kernel_modules:
make -C /lib/modules/$(KVER)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(KVER)/build M=$(PWD) clean
编译时,只需
[csharp]
view plaincopy
make
重新编译时,只需
[cpp]
view plaincopy
make clean
相关文章推荐
- 为Android添加一门新语言
- 七牛是如何搞定每天500亿条日志的
- 泛函编程(36)-泛函Stream IO:IO数据源-IO Source & Sink
- Java容器
- 泛函编程(36)-泛函Stream IO:IO数据源-IO Source & Sink
- Xcode7真机调试
- 开始新路程了,配置Android开发环境
- 读书笔记之c和指针(1)
- 使用JAX-WS开发WebService简单入门(1)
- bootstrap( 导航条、分页导航)
- Qt 常用类 (7)—— QPixmap
- (转)MEF+Unity
- git rev tips
- spark中的SparkContext实例的textFile使用的小技巧
- 使用screen 关闭终端 继续运行
- hibernate的相关知识
- Lua调用C++带参数的方法
- UIImageJPEGRepresentation和UIImagePNGRepresentation
- c++ 结构体排序
- Qt 常用类 (6) —— QFont