本文共 1888 字,大约阅读时间需要 6 分钟。
#文件名为Makefileifneq ($(KERNELRELEASE),)# ko 文件名 不能与 目标文件名 相同MODULE_NAME = lkm_testobj-m := $(MODULE_NAME).o#目标文件名# file1.o file2.o dir1/file3.o$(MODULE_NAME)-objs := test.oelse CODEDIR ?= /home/pop/work/960/960_0424 KERNELDIR ?= $(CODEDIR)/out/target/product/sw960/obj/KERNEL_OBJ PWD ?= $(shell pwd) ARCH = arm CROSS_COMPILE = $(CODEDIR)/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-.PHONY: modules cleanmodules: $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR) M=$(PWD) modulesclean: $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) cleanendif
/*文件名为test.c*/#include#include #include MODULE_LICENSE("Dual BSD/GPL");static int mytest = 100;module_param(mytest,int,0644);MODULE_PARM_DESC(mytest,"test for module parameter");static int __init hello_init(void){ printk(KERN_ALERT "hello world!\n"); printk(KERN_ALERT "%d\n",mytest); return 0;}static void __exit hello_exit(void){ printk(KERN_ALERT "Goodbye!\n");}module_init(hello_init);module_exit(hello_exit);
1. 将该文件夹放入到工程外2. 修改Makefile CODEDIR ?= /home/pop/work/960/960_0424 修改上行为 你的源码工程所在目录 若要用于其他项目,需要确定交叉编译器的位置并修改 // 去编译生成文件目录下去找 .xxx.o.cmd 文件,查gcc关键字 CROSS_COMPILE = $(CODEDIR)/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-3. 在 当前目录执行 make ,回生成 lkm_test.ko make4. insmod 出现问题 insmod: failed to load lkm_test.ko: Required key not available https://blog.csdn.net/ozhengsfo/article/details/75114297 在/system/lib/modules目录下,动态安装内核模块时(insmod hello.ko)出现insmod: failed to load hello.ko: Required key not available 解决方法 在配置文件中关闭内核签名的功能 kernel/msm-3.18/arch/arm64/configs/msmcortex_defconfig 调试版本 kernel/msm-3.18/arch/arm64/configs/msmcortex-perf_defconfig 非调试版本 将这两个文件里面的下面三个配置参数关闭 CONFIG_MODULE_SIG=n CONFIG_MODULE_SIG_FORCE=n CONFIG_MODULE_SIG_SHA512=n 重新编译内核,adb和fastboot更新boot.img,就可以进行动态安装模块。