1.准备
需要准备好Linux内核源码(作者使用的是Linux-5.15.36),对应的交叉编译工具(如果编译工具不匹配,大概率在编译过程中会有报错或提示显示,作者使用的如图是arm-cross-tools),需要编译成.ko文件的内核模块代码(如图在test目录下),rootfs是配置所需的根目录
test目录下的hello.c代码如下:
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("T_C");
int hiworld(void)
{
printk(KERN_INFO "Hello, world!\n");
return 0;
}
void saybye(void)
{
printk(KERN_INFO "Goodbye, world!\n");
}
module_init(hiworld);
module_exit(saybye);
2.环境变量声明
声明目标机架构
声明交叉编译器前缀,声明成功,则-v有效
3.内核配置,并编译
方法1(有配置文件):
一般配置好的配置文件可以存放在linux-5.15.36/arch/arm/configs目录下,如:
作者的配置文件是zynq_myc_defconfig,-j4是为了加快编译速度
方法2(无配置文件):
没有配置文件,则需要自己进行配置
//进入内核配置界面,进行配置选项
make menuconfig
//配置完成后,进行编译
make -j4
4.创建内核对象文件(.ko)
方法1(直接编译生成):
//直接方法
make -C 内核源代码路径 M=内核模块代码路径 modules
方法2(制作Makefile):
//打开Makefile
vi Makefile
//写入以下内容
ARCH=arm
KERNELDIR=/home/tc/DeskTop/test/linux-5.15.36
ifneq ($(KERNELRELEASE),)
# call from kernel build system
obj-m := hello.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
depend .depend dep:
$(CC) $(EXTRA_CFLAGS) -M *.c > .depend
ifeq (.depend,$(wildcard .depend))
include .depend
endif
//写完后,保存关闭
:wq!
//make,进行编译
make
如图
5.验证
将hello.ko下载到开发板中,如图,加载模块和卸载模块