Ubuntu下简单的hello world驱动实现
hello.c:驱动文件
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void){
printk(KERN_ALERT "hello world");
return 0;
}
static int hello_exit(void){
printk(KERN_ALERT "exit");
return 0;
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("xxx");
Makefile:
obj-m注意是m;一开始写成M了,Building modules,stage 2. MODPOST 0 modules.
m表示不会编译到ZImage,会生成一个独立的.ko文件 (-y 表示编译进ZImage)
Ubunt源码版本是4.4.0-142,由于我下载的是3.13.11,下不到对应版本的,所以在insmod hello.ko,会出现 ERROR: could not insert module hello.ko: Invalid module format
解决方法:将KDIR转移到系统的驱动生成的路径中 /lib/modules/4.4.0-142-generic/build
下载对应系统可参考https://blog.csdn.net/weixin_42048417/article/details/80811484
ismod rmmod的打印信息 dmesg | tail 可以看到
obj-m += hello.o
##源码位置
##KDIR := /lib/modules/3.13.11-ckt39/build
KDIR := /lib/modules/4.4.0-142-generic/build
PWD ?= $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o *.symvers *.order
之前写的Android.mk的编写规则(感觉和Makefile差不多先留着,没仔细去区分);当需要使用JNI时,需要创建native工程。Android.mk就是makefile配置文件,使得C/C++的代码变成成动态库
ifeq的用法:
ifeq($(变量值),变量值)
endif
如果后面没有变量值,则是判断前面有没有存在
与操作
如果要判断两个值都存在才执行,则使用
ifeq($(value1)$(value2),)
如果两个值都有具体的值,则使用"_"
ifeq($(value1)_$(value2),V1_V2);
或操作
如果要判断两个值只需一个存在,则使用
ifneq($(findstring $(value1)$(value2),V1 V2),)
$(findstring< find >< in >) 从in中寻找find 如果找到则返回find;否则返回空字符串;
$(findstring a, a b c) = a
$(findstring a, b c) = " "
赋值运算
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有赋值过就赋予等候后面的值
+= 是添加等号后面的值
include的用法
如果没有指定绝对路径和相对路径的话,make会在当前目录下首先寻找
如果make执行时 make -l 或 make --include-dir 则在指定目录下寻找
include foo.make a.mk b.mk c.mk e.mk f.mk
-include 若没有找到指定的文件,不会中断make;只有不能完成最终目标重建时才会退出
sinclude 功能同上