Linux内核模块编译出错:ER...
嵌⼊式Linux简单内核模块的编程:
将以下hello.c和Makefile⽂件放在同⼀⽬录,然后make⼀下⽣成hello.ko⽂件
hello.c的内容:
#include "linux/module.h"
#include "linux/init.h"
static int __init hellomodule_init(void) //模块初始化函数
{
printk("Hello_init! Are you ok ? oLHHo \n");
return 0;
}
static void __exit hellomodule_exit(void) //模块退出函数
{
printk("Hello_exit! Oh_Yes!");
return 0;
}
module_init(hellomodule_init);
module_exit(hellomodule_exit);
MODULE_LICENSE("GPL");
⼀个简单的内核模块主要由4个部分组成:包含头⽂件、实现内核模块初始化函数和模块退出函数、使⽤module_init 和module_exit 宏指定模块初始化函数和模块退出函数、声明模块license为"GPL",这4个部分是⼀个模块必需的,也就构成了内核模块的框架。
Makefile的内容:
编译器错误ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else
KDIR :=/home/olhho/opt/linux-2.6.30.9  #⾃⼰编译的内核的存放路径
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers  modul*
endif
obj-m:为内核顶层⽬录Makefile⽂件中使⽤的变量,表⽰要编译成模块的⽬标⽂件。Obj-m = hello.o,表⽰将该⽬录下的hello.c模块源码⽂件编译成模块。
KDIR:内核⽬录,即⽤来编译模块的内核源码所以在⽬录。
ARCH=arm CROSS_COMPILE=arm-linux-:为arm配置交叉编译器
make出现以下错误:
root@olhho:/home/olhho/kernel_module# make
make -C /home/olhho/opt/linux-2.6.30.9 M=/home/olhho/kernel_module modules ARCH=arm CROSS_COMPILE=arm-linux-
make[1]: Entering directory `/home/olhho/opt/linux-2.6.30.9'
ERROR: Kernel configuration is invalid.
include/linux/autoconf.h or include/f are missing.
Run 'make oldconfig && make prepare' on kernel src to fix it.
WARNING: Symbol version dump /home/olhho/opt/linux-2.6.30.9/Module.symvers
is missing; modules will have no dependencies and modversions.
Building modules, stage 2.
/home/olhho/opt/linux-2.6.30.9/dpost:43: include/f: No such file or directory make[2]: *** No rule to make target `include/f'.  Stop.
make[1]: *** [modules] Error 2
make[1]: Leaving directory `/home/olhho/opt/linux-2.6.30.9'
make: *** [all] Error 2
出现以上错误原因:⾃⼰太懒了,之前编译过的内核被移除了,新的内核没配置编译,果断重新配置编译,然后,make⽣成hello.ko⽂件,再按照以下操作即可。
⼀.打开串⼝⼯具DNW:
1.移植内核 zImage
2.根⽂件系统 root_olhho.img
⼆.打开SecureCRT终端:
1.连接到板⼦,让板⼦跑起来
2.选择 Transfer-->Zmodem ,然后选择添加-->开始上传
3.加载模块命令:insmod(必须在当前⽬录下使⽤),例: insmod hello.ko
使⽤lsmod(该命令可以不在当前⽬录使⽤),可以查看当前加载到内核的模块
删除模块命令:rmmod(该命令可以不在当前⽬录使⽤),删除不需要使⽤的内核模块
4.dmesg显⽰开机信息,查看printK信息
printk不显⽰在超级终端上,保存在/var/log/messages。
可以通过dmesg命令查看,如果只想显⽰最后⼏⾏,可以⽤
dmesg | tail - 8

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。