SRWE 窗口实时编辑器:4 步把运行中窗口调到 4K,不改配置、免重启
2026/8/24 16:00:33
编写Linux内核驱动生成.ko(内核模块)文件,不一定需要把代码放到内核源码目录编译,但核心取决于你的编译方式——有两种主流方式,对应不同的文件存放逻辑,推荐第二种(更灵活):
drivers/i2c/devices/、drivers/misc/);Kconfig和Makefile,让内核编译系统识别你的驱动;aht20.c放到linux-src/drivers/i2c/devices/;Makefile,添加:obj-$(CONFIG_AHT20) += aht20.o;Kconfig,添加驱动配置项;make modules编译出.ko。Makefile指定内核源码路径,驱动代码可放在任意目录(如/home/yourname/drivers/aht20/);KERNELDIR指向内核源码目录,借助内核的scripts/Makefile.modpost工具完成编译,无需修改内核源码;以编译AHT20驱动为例,全程无需把代码放进内核目录:
比如在/home/root/drivers/aht20/下创建两个文件:
aht20.c(驱动源码,略);Makefile(核心,指定内核路径和编译规则):# 1. 指定你的内核源码目录(开发板对应的内核源码,不是系统内核) KERNELDIR ?= /home/root/linux-4.19.35-imx6ul # 替换为你的内核源码路径 # 2. 指定编译后的模块存放目录(可选,默认当前目录) PWD ?= $(shell pwd) # 3. 内核模块编译规则 obj-m += aht20.o # 要编译的驱动文件:aht20.c → aht20.ko # 4. 编译目标 all: make -C $(KERNELDIR) M=$(PWD) modules # -C进入内核目录,M指定驱动目录 clean: make -C $(KERNELDIR) M=$(PWD) clean在驱动目录执行编译命令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- # 交叉编译(根据你的编译器调整)ARCH=arm:指定CPU架构(ARM);CROSS_COMPILE:指定交叉编译器前缀(和你的开发板匹配);aht20.ko(还有.o/.mod.c等中间文件)。.ko的内核源码,必须和开发板运行的内核“版本+配置+编译选项”完全一致(否则insmod时会报version magic mismatch);4.19.35,就必须用同版本的内核源码编译,不能用Ubuntu系统的内核源码。linux/i2c-dev.h),内核源码会自动提供,无需额外拷贝。arm-linux-gnueabihf-gcc 7.5,驱动也得用这个版本)。make defconfig/make menuconfig)并编译过(至少编译出vmlinux),否则会缺少头文件和编译依赖;.ko无需放到内核目录,直接拷贝到开发板任意目录(如/lib/modules/$(uname -r)/extra/),执行insmod aht20.ko即可加载。~/drivers/)创建代码和Makefile,编译即可,完全不用动内核源码目录。