news 2026/8/18 19:35:00

内核驱动添加与裁剪

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
内核驱动添加与裁剪

目录

1.基础概念

1.1 内核是怎么管理代码的?

1.2 三个关键文件

1.3 三个编译状态

1.4 配置变量

2. 如何添加驱动(完整步骤)

第1步:在 drivers/char/Makefile 中增加目录引用

第2步:在 drivers/char/fire_led/ 下创建你自己的 Makefile

第3步:在 drivers/char/fire_led/ 下创建 Kconfig 文件

第4步:让上级Kconfig包含你的Kconfig

第5步:生成并修改 .config 配置

第6步:编译内核

3. 内核裁剪简述

1.基础概念

1.1 内核是怎么管理代码的?

  • 内核源码由成千上万个文件组成,分散在不同目录下。

  • 每个目录下都有一个Makefile和一个Kconfig文件,它们决定了哪些代码被编译,以及如何让用户选择。

1.2 三个关键文件

文件作用
Makefile告诉编译系统哪些文件要编译,编译成什么(是编进内核镜像,还是编成独立的模块)
Kconfig定义配置选项,这些选项会出现在make menuconfig的图形菜单里
.config存储你最终选择的所有配置项(y/n/m),编译时依据这个文件

KbuildLinux 内核自己的构建系统(Kernel Build System),作用是:

负责根据配置(.config)决定哪些代码需要编译、怎么编译、生成内核镜像和模块。

简单理解:

  • Make是工具
  • Makefile是规则文件
  • Kbuild 是 Linux 内核定义的一套 Makefile 规则和框架
  • 最终执行编译、链接等动作的还是make,但 Kbuild 提供了一套内核约定的规则、变量和流程,把复杂的编译管理封装起来

1.3 三个编译状态

  • obj-y→ 编译进内核镜像(固定在内核里,开机就有)

  • obj-m→ 编译成独立的模块(.ko文件,可以手动加载/卸载)

  • obj-(空) → 不编译

1.4 配置变量

  • 在Kconfig中定义的config FOO,会生成变量CONFIG_FOO

  • 这个变量的值(y/m/n)由.config决定,Makefile通过obj-$(CONFIG_FOO)来引用它。

2. 如何添加驱动(完整步骤)

假设想在drivers/char/下新建一个目录fire_led/,里面放你的驱动源码led_cdev.c

第1步:在drivers/char/Makefile中增加目录引用

打开drivers/char/Makefile,添加下面任意一行(选一种):

obj-$(CONFIG_FIRE_ABC) += fire_led/ # 由配置决定是否编译该目录 # 或者 obj-y += fire_led/ # 总是编译该目录(不推荐,最好用配置控制)

第2步:在drivers/char/fire_led/下创建你自己的 Makefile

新建文件drivers/char/fire_led/Makefile,内容如下:

obj-$(CONFIG_GXA_LED) += led_cdev.o

这表示:如果CONFIG_GXA_LED被定义为ym,则编译led_cdev.c成目标文件。

第3步:在drivers/char/fire_led/下创建 Kconfig 文件

新建drivers/char/fire_led/Kconfig,内容示例:

menuconfig FIRE_ABC bool "Fire LED Framework" help 这是驱动框架的菜单项,选上它才能看到子选项。 config GXA_LED tristate "support fire led" depends on FIRE_ABC help 这是具体的LED驱动,依赖上面的FIRE_ABC。
  • bool→ 只能选 y 或 n(编入内核或不编)

  • tristate→ 可以选 y / m / n(编入内核、模块、不编)

  • depends on→ 只有父项被选中,该项才可见

第4步:让上级Kconfig包含你的Kconfig

打开drivers/char/Kconfig,在合适位置添加:

source "drivers/char/fire_led/Kconfig"

这样,在make menuconfig时就能看到你的菜单了。

第5步:生成并修改 .config 配置

# 先使用参考配置(以arm架构为例)这一步也可以使用自己的准备好的shell脚本导入arch 以及编译器的变量make ARCH=arm npi_v7_defconfig # 然后打开图形配置界面 make ARCH=arm menuconfig

在菜单中找到Fire LED Framework并选上,再进入子项support fire led,按需求选ym

保存退出后,.config中会自动出现:

CONFIG_FIRE_ABC=y CONFIG_GXA_LED=m # 或 y

第6步:编译内核

make -j4
  • 如果选的是y,驱动会编译进内核镜像(zImage)。

  • 如果选的是m,会生成led_cdev.ko模块文件。

3. 内核裁剪简述

  • 裁剪就是通过make menuconfig取消不需要的功能,减小内核体积。

  • 原则:去掉obj-y中不必要的模块,或把y改成m(如果可能)。

  • 常用命令:make menuconfig里按空格切换状态,/搜索选项。


现在不再大量依赖 machine_desc 进行板级初始化,machine_desc 主要用于 DT 平台匹配和少量早期初始化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/18 19:33:59

从泄露图解读红旗H7设计:后驱平台、分体大灯与光影雕塑

1. 从一张“泄露图”说起:如何解读一款未发布车型的设计语言 最近,一张疑似全新红旗H7的图片在网络上流传开来,瞬间点燃了车迷和行业观察者的讨论热情。对于汽车爱好者而言,这种非官方渠道的“泄露图”就像一份提前开卷的考卷&…

作者头像 李华
网站建设 2026/8/18 19:30:21

构建双核驱动的Agentic AI:药物教育中的科学知识与法规智能融合

1. 项目缘起:当AI不只是“答题器”,而是“主动的导师”最近在做一个关于药物使用教育的项目,和团队讨论时,我们遇到了一个核心矛盾:现有的教育工具,无论是网站、APP还是互动课程,大多停留在“信…

作者头像 李华
网站建设 2026/8/18 19:29:02

Python 对接腾讯云 OCR API|多场景图片文字识别完整开发指南(本地 / 网络图片、批量识别、业务落地)

目录 一、前言 二、腾讯云 OCR 服务开通与前置配置全流程 2.1 云服务开通步骤 2.2 Python SDK 环境依赖安装 2.3 核心前置参数说明 三、Python 完整封装 OCR 工具类(多识别模式) 四、三大真实业务落地应用案例 案例 1 政务档案数字化批量文字提取 业务痛点 改造方案…

作者头像 李华
网站建设 2026/8/18 19:27:35

网易云NCM文件无法播放?一个免费工具彻底解决格式转换难题

网易云NCM文件无法播放?一个免费工具彻底解决格式转换难题 【免费下载链接】ncmdump 转换网易云音乐 ncm 到 mp3 / flac. Convert Netease Cloud Music ncm files to mp3/flac files. 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdump 你有没有过这样的…

作者头像 李华
网站建设 2026/8/18 19:23:40

从C到C++:编程思维跃迁与核心特性实战指南

1. 从C到C:一次思维模式的跃迁 最近在技术社区里,看到不少有C语言背景的开发者开始尝试接触C。这让我想起了自己当年从C转向C的经历,那感觉就像从一个熟悉的、功能完备但略显简陋的工坊,走进了一个琳琅满目、工具繁多的大型现代化…

作者头像 李华
网站建设 2026/8/18 19:21:43

基于Django与LLM的智能旅游推荐系统设计与实现

1. 项目背景与核心价值 这个毕业设计项目本质上是一个融合了传统Web开发框架与现代AI技术的智能旅游推荐系统。作为一名带过数十个毕业设计的导师,我发现这类系统正成为计算机专业学生展示全栈能力的热门选择——它既包含了扎实的数据库操作和Web开发基本功&#xf…

作者头像 李华