第一个内核模块嵌入由于书上代码实在简洁,自己研究通过,供大家参考
先写makefile 文件起名一定要Makefile 首字母大写,否则make过程中不能调用自己
其次,makefile仔细研究,发现
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
#内核源代码的绝对路径要根据系统实际变化
最后 最坑的是大家不熟悉makefile的 根本不知道
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
中 M前后到底有没有空格,M前有空格,后面没有
clean modules前有一个空格
$前有一个空格
:=连着没空格,后面接变量也没有
all:后跟tab常识..
通过的makefile如下,可直接复制:
obj-m:=hellomod.o
#obj-m:=是赋值语句,使用目标文件hellomod.o生成模块hellomod.ok
#产生hellomod模块的目标文件
CURRENT_PATH:=$(shell pwd)
#模块所在的当前路径
LINUX_KERNEL:=$(shell uname -r)
#内核源代码的当前版本
LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)
#内核源代码的绝对路径
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
#编译模块
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
通过的hellomod.c:
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>
int lkp_init(void)
{
printk("<1>Hello,from the kernel sapce\n");
return 0;
}
void lkp_cleanup(void)
{
printk("<1>goodbye,leaving kernel sapce\n");
}
module_init(lkp_init);
module_exit(lkp_cleanup);
MODULE_LICENSE("GPL");
注释书上有 仔细读;
最后 再sodu make搞定
我的linux生成一堆
hellomod.c hellomod.mod.c makefile~ modules.order
C++11.cpp hellomod.c~ hellomod.mod.o Makefile Module.symvers
cp.c hellomod.ko hellomod.o
然后照着书后操作 sudo insmod hellomod.ko即可
最后关于查看日志
我的linux也显示出很多日志文件 具体显示可以找
kern.log 或 syslog