news 2026/7/7 18:49:42

28.驱动程序,生成ko文件,需要放到特定文件夹去编译吗?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
28.驱动程序,生成ko文件,需要放到特定文件夹去编译吗?

编写Linux内核驱动生成.ko(内核模块)文件,不一定需要把代码放到内核源码目录编译,但核心取决于你的编译方式——有两种主流方式,对应不同的文件存放逻辑,推荐第二种(更灵活):

一、两种编译方式的文件存放规则

方式1:内核源码树内编译(传统方式,需放特定目录)
  • 要求:必须把驱动代码放到Linux内核源码的指定目录(如drivers/i2c/devices/drivers/misc/);
  • 原因依赖内核源码的Makefile体系,需要修改目录下的KconfigMakefile,让内核编译系统识别你的驱动
  • 步骤示例(以AHT20驱动为例):
  • aht20.c放到linux-src/drivers/i2c/devices/
  • 修改该目录下的Makefile,添加:obj-$(CONFIG_AHT20) += aht20.o
  • 修改该目录下的Kconfig,添加驱动配置项;
  • 回到内核根目录,执行make modules编译出.ko
  • 缺点:侵入内核源码,不灵活,多驱动开发时易混乱;
  • 适用场景:驱动需要合入内核主线、或依赖内核深层接口。
方式2:内核源码树外编译(推荐,无需放特定目录)
  • 核心:通过自定义Makefile指定内核源码路径,驱动代码可放在任意目录(如/home/yourname/drivers/aht20/);
  • 原理:自定义Makefile通过KERNELDIR指向内核源码目录,借助内核的scripts/Makefile.modpost工具完成编译,无需修改内核源码;
  • 优势:驱动代码独立,编译不影响内核源码,灵活易管理;
  • 新手必用:99%的嵌入式驱动开发场景(如AHT20/PCF8574驱动)都用这种方式。

二、独立目录编译.ko(无需内核源码目录)

以编译AHT20驱动为例,全程无需把代码放进内核目录:

步骤1:任意目录创建驱动代码和Makefile

比如在/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
步骤2:编译生成.ko

在驱动目录执行编译命令:

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,驱动也得用这个版本)。

三、常见误区澄清

  1. “必须放内核目录”是错的:只有要把驱动合入内核主线时才需要,普通开发完全不用;
  2. “任意目录编译”的前提:内核源码必须提前配置(make defconfig/make menuconfig)并编译过(至少编译出vmlinux),否则会缺少头文件和编译依赖;
  3. .ko的安装:编译好的.ko无需放到内核目录,直接拷贝到开发板任意目录(如/lib/modules/$(uname -r)/extra/),执行insmod aht20.ko即可加载。

总结

  • 无需把驱动代码放到内核特定目录编译,独立目录+自定义Makefile是嵌入式驱动开发的标准做法;
  • 核心是Makefile中指定正确的内核源码路径,保证内核版本、工具链和开发板匹配;
  • 对你的AHT20/PCF8574驱动开发,直接在自己的工作目录(如~/drivers/)创建代码和Makefile,编译即可,完全不用动内核源码目录。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 10:55:35

P1319 压缩技术

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h>int main() {// 动态读取所有压缩码数字int* codes NULL;int count 0;int capacity 10;int num;// 初始分配内存codes (int*)malloc(capacity * sizeof(int));// 读取所有数字while (s…

作者头像 李华
网站建设 2026/7/7 18:23:21

冒泡排序与选择排序详解

《冒泡排序和选择排序》冒泡排序&#xff1a;冒泡排序&#xff1a;两两相比&#xff0c;如果前面大于后面的值交换位置外循环要经过多少轮比较 一轮找出一个最值内循环比较多少次 例如5个数比较4次即可 下一轮的时候 不用和上传最值进行比较&#xff0c;所以写内循环次数可以 这…

作者头像 李华
网站建设 2026/7/6 23:38:37

告别AI痕迹:5款智能工具

现在AI“大行其道”&#xff0c;很多同学都学会了用chatgpt或者其他AI工具来辅助写论文&#xff0c;但是一些论文检测平台却管得更严了&#xff0c;不仅有查重检测&#xff0c;居然还有AI率检测&#xff01;很多高校也开始卡AI率&#xff0c;AI率不过关的很有可能论文不通过&am…

作者头像 李华
网站建设 2026/7/7 9:59:45

探索 SCN - Adaboost 的回归预测之旅

SCN-adaboost基于随机配置网络SCN的Adaboost回归预测&#xff0c;SCN-Adaboost回归预测&#xff0c;多输入单输出模型。 评价指标包括:R2、MAE、MSE、RMSE和MAPE等&#xff0c;代码质量极高&#xff0c;方便学习和替换数据。在机器学习的广袤世界里&#xff0c;回归预测一直是一…

作者头像 李华
网站建设 2026/7/7 6:16:38

探索对称双向半桥LLC谐振变换器双向运行仿真模型

对称双向半桥LLC谐振变换器双向运行仿真模型。 模型采用闭环PI控制&#xff0c;频率控制方法。 输出效果好&#xff0c;效率高。 如展示图所示。 matlab/simulink最近在研究电力电子相关内容时&#xff0c;接触到了对称双向半桥LLC谐振变换器双向运行仿真模型&#xff0c;感觉特…

作者头像 李华