0.项目结构&环境
1. 项目结构
./Makefile
./my_mod.c
./my_mod.ko //编译后产生
2. 环境
编译环境:
ubuntu 18.4,
toolchain:
toolchain-arm_cortex-a7_gcc-5.2.0_musl-1.1.16_eabi,
arm-openwrt-linux-xxx,
运行环境
高通IPQ6010,openwrt,32bit,linux-4.4,arm,
1. 源码简析
1. 头文件
#include <linux/init.h>
#include <linux/module.h>
2. 主体
2.1 my_mod.c
// 头文件
#include <linux/init.h>
#include <linux/module.h>
//加载时初始化函数
static int __init my_mod_init(void)
{
printk(">>> my_mod init <<<\n");
return 0;
}
//退出时退出函数
static void __exit my_mod_exit(void)
{
printk(">> my_mod exit <<<\n");
}
// 这是两个宏展开,简洁但不简单
module_init(my_mod_init);
module_exit(my_mod_exit);
// 开源协议、作者信息等等,
MODULE_LICENSE("GPL"); // 开源协议,不声明开源协议的话相关开源函数你没法用
//MODULE_LICENSE("GPL v2"); // 开源协议是有差距的,百度下以防万一
MODULE_AUTHOR("Liam@xxxx.com");
PS:以上头文件、初始化函数、退出函数、宏定义(或者展开)、开源协议都是基础部分。
2.2 Makefile
LIAM_ARCH=arm
LIAM_CROSS_COMPILE=/CCCC/toolchain-arm_cortex-a7_gcc-5.2.0_musl-1.1.16_eabi/bin/arm-openwrt-linux-
obj-m:=my_mod.o
PWD:=$(shell pwd)
KERNELDIR=/AAAA/qsdk/qca/src/linux-4.4/
.PHONY:all
all:
@$(MAKE) ARCH=$(LIAM_ARCH) CROSS_COMPILE=$(LIAM_CROSS_COMPILE) -C $(KERNELDIR) M=$(PWD) modules
@rm -rf .*.cmd *.o *.mod.c .tmp_versions *.order *symvers *Module.markers
.PHONY:clean
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions *.order *symvers *Module.markers
ps:
编译module需要定义这么几个数据:
ARCH:module运行的平台,arm arm64 x86 等等
CROSS_COMPILE : 交叉编译器的路径
KERNEDDIR:kernel源文件所在目录
make -C 与 M 参数建议百度。
2. 编译
编译环境:ubuntu18.4 , openwrt-gcc(32bit) ,
# cmd
/* 个人源码路径下输入 */
make // 默认执行第一条编译命令
# log
/*
xxxxx$ make
make[1]: Entering directory '/AAAA/qsdk/qca/src/linux-4.4'
CC [M] /BBBB/my_mod.o
Building modules, stage 2.
MODPOST 1 modules
CC /BBBB/my_mod.mod.o
LD [M] /BBBB/my_mod.ko
make[1]: Leaving directory '/AAAA/qsdk/qca/src/linux-4.4'
*/
注1:
AAAA 为kernel路径,
BBBB 为源码路径,
CCCC 为toolchain路径,
注2:
编译后产生.ko文件,EG:my_mod.ko
3. 加载、移除module
运行环境: 高通IPQ6010 , 32bit , linux-4.4 ,arm
# cmd : 加载module
//tftp 导入module到开发板/tmp/目录下
/* cd /tmp/;tftp -gr my_mod.ko 192.168.1.100 */
insmod ./my_mod.ko
# cmd : 移除module
rmmod my_mod
# log
/*
root@OpenWrt:/# cd /tmp/
root@OpenWrt:/tmp#
root@OpenWrt:/tmp# tftp -gr my_mod.ko 192.168.1.10
root@OpenWrt:/tmp#
root@OpenWrt:/tmp# insmod ./my_mod.ko
[ 183.246098] >>> my_mod init <<<
root@OpenWrt:/tmp#
root@OpenWrt:/tmp#
root@OpenWrt:/tmp# rmmod my_mod
[ 189.742962] >> my_mod exit <<<
root@OpenWrt:/tmp#
*/