news 2026/2/8 10:44:52

4.kconfig语法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
4.kconfig语法

Kconfig本质是内核配置菜单的 “描述语言”,语法简洁但有明确的规则。

一、Kconfig 核心语法规则(基础必懂)

1. 注释
  • 单行注释:用#开头(和 Shell/Makefile 一致);
  • 无多行注释,多行需每行加#

config

# 这是注释:定义字符设备驱动配置项 config HELLO_DRV tristate "Hello World Driver"
2. 大小写敏感
  • 配置项名称(如CONFIG_HELLO_DRV严格区分大小写,建议全大写 + 下划线(行业惯例);
  • 关键字(如configtristatemenu小写,是固定语法。
3. 缩进规则
  • 子项(如tristatehelpdepends on)需缩进(通常 4 个空格,不要用 Tab);
  • 同一层级的选项缩进一致,保证可读性。

二、Kconfig 核心关键字(按使用频率排序)

1.config- 定义单个配置项(最核心)
  • 作用:声明一个配置项(对应.config中的CONFIG_XXX),是所有驱动 / 功能配置的基础;

  • 格式:config 配置项名称+ 缩进的属性(类型、描述、依赖等);

  • 类型(必选):

    类型含义对应.config 值适用场景
    tristate三态(内置 / 模块 / 不编译)y/m/n驱动(支持编译为模块)
    bool布尔(启用 / 禁用)y/n内核功能(不支持模块)
    string字符串值自定义字符串如设备树路径、版本号
    int整数值数字如缓冲区大小、超时时间
    hex十六进制值十六进制数如寄存器地址、掩码
  • 示例(三态驱动配置项):

config

config HELLO_DRV tristate "Hello World Character Driver" # 界面显示的名称 help # 帮助说明(可选但推荐) This is a simple char driver for RK356X platform. Say Y/M to compile it into kernel/module, N to disable.
2.menu/endmenu- 定义菜单分组
  • 作用:将相关配置项归类到一个可视化菜单中(menuconfig界面中可展开 / 折叠);
  • 格式:menu "菜单名称"+ 缩进的配置项 +endmenu
  • 示例(字符设备菜单):

config

menu "Character devices" # menuconfig中显示的菜单名 config HELLO_DRV tristate "Hello World Driver" help Simple char driver test. config TTY bool "Enable TTY support" default y endmenu # 结束菜单分组
3.depends on- 配置项依赖(条件限制)
  • 作用:限制配置项的显示 / 可选性,只有依赖条件满足时,该配置项才会出现在menuconfig中;
  • 格式:depends on 条件(条件可多个,用&&/||连接);
  • 示例(仅 ARM64 架构可见):

config

config HELLO_DRV tristate "Hello World Driver" depends on ARCH_ROCKCHIP && ARM64 # 仅RK356X(ROCKCHIP)+ ARM64架构可见 help Driver for RK356X ARM64 platform.
4.default- 设置默认值
  • 作用:指定配置项的默认值(无需手动选择时的默认状态);
  • 格式:default 值 [if 条件](条件可选);
  • 示例:

config

config HELLO_DRV tristate "Hello World Driver" depends on ARM64 default m if ARCH_ROCKCHIP # RK架构默认编译为模块 default n # 其他架构默认不编译
5.select- 强制选中依赖项
  • 作用:当当前配置项被选中(y/m)时,强制将另一个配置项设为y(单向依赖);
  • 格式:select 被依赖的配置项
  • 示例(选驱动时强制启用字符设备核心):

config

config HELLO_DRV tristate "Hello World Driver" depends on ARM64 select CHR_DEV # 选中HELLO_DRV时,CHR_DEV自动设为y
6.prompt- 自定义界面显示名称
  • 作用:替代tristate/bool后的字符串,单独定义菜单中显示的名称(等价写法,可选);
  • 示例:

config

config HELLO_DRV tristate prompt "Hello World Driver" # 和直接写tristate "xxx"效果一致 default m
7.source- 引入其他 Kconfig 文件
  • 作用:在当前 Kconfig 中引入子目录的 Kconfig,实现配置项的分层管理(内核核心机制);
  • 格式:source "路径/文件名"
  • 示例(内核根目录 Kconfig 引入字符设备配置):

config

# 内核根目录 Kconfig source "drivers/char/Kconfig" # 加载字符设备目录的Kconfig source "drivers/spi/Kconfig" # 加载SPI驱动目录的Kconfig
8.choice/endchoice- 单选菜单
  • 作用:创建互斥的单选选项(只能选其中一个);
  • 格式:choice+ 缩进的config(仅bool/tristate) +endchoice
  • 示例(驱动模式选择):

config

choice prompt "Hello Driver Mode" default HELLO_DRV_NORMAL config HELLO_DRV_NORMAL bool "Normal Mode" config HELLO_DRV_DEBUG bool "Debug Mode" endchoice

三、实战示例(RK356X 驱动的 Kconfig 完整写法)

以下是适配你场景的完整Kconfig片段(放在drivers/char/Kconfig中):

config

# 字符设备菜单下添加自定义驱动 menu "Character devices" # 自定义驱动配置项 config HELLO_DRV tristate "Hello World Driver for RK356X" depends on ARCH_ROCKCHIP && ARM64 # 仅RK356X ARM64可见 default m # 默认编译为模块 select CHR_DEV # 依赖字符设备核心 help This is a simple character driver for Rockchip RK356X platform. If you want to compile it as a module, choose M (recommended), compile into kernel choose Y, or N to disable. endmenu

四、语法校验与常见坑

  1. 校验方法:修改 Kconfig 后执行make menuconfig,若界面能正常打开且配置项显示,说明语法无错;若报错syntax error,检查缩进 / 关键字拼写。
  2. 常见错误
    • 缩进用 Tab 而非空格(内核要求空格);
    • depends on后条件写错(如ARCH_RK356X写成RK356X);
    • 三态配置项用bool类型(导致无法编译为模块)。

总结

  1. Kconfig核心是通过config定义配置项,用menu分组,depends on做条件限制,default设默认值;
  2. 驱动开发中最常用的是tristate类型(支持模块编译)+depends on(匹配开发板架构);
  3. 关键语法:配置项名称大写、子项缩进 4 空格、依赖条件匹配开发板(如ARCH_ROCKCHIP)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/30 16:26:54

17. 纹理压缩

1.纹理压缩1.纹理压缩 a.硬盘中: 存储压缩后的纹理文件(如.unity3d里的ETC2纹理)- 状态: 压缩态(ETC2/ASTC格式), 文件体积小- 目的: 减少硬盘存储和加载时的IO带宽b.加载到内存(RAM): 依然是压缩态, 未解压- 状态: 压缩态(和硬盘中格式一致)- 关键: Unity通过DMA加载时, 直接把…

作者头像 李华
网站建设 2026/2/7 0:07:47

使用Git Stash临时保存未完成的TensorFlow代码

使用Git Stash临时保存未完成的TensorFlow代码 在深度学习项目开发中,你是否遇到过这样的场景:正全神贯注地调试一个Transformer模型的注意力层,训练刚跑出第一轮结果,突然收到消息——生产环境的数据预处理流水线出了问题&#x…

作者头像 李华
网站建设 2026/2/4 7:56:08

transformer模型详解多头注意力:TensorFlow实现细节

Transformer 多头注意力机制与 TensorFlow 实现深度解析 在自然语言处理领域,模型如何“理解”上下文,始终是一个核心挑战。早期的 RNN 结构受限于序列依赖和梯度消失问题,难以捕捉长距离语义关联;CNN 虽然具备局部并行能力&#…

作者头像 李华
网站建设 2026/2/5 12:35:58

Docker images列出本地TensorFlow镜像信息

Docker 环境下 TensorFlow 镜像的管理与实战应用 在深度学习项目日益复杂的今天,环境配置常常成为开发者面前的第一道门槛。你是否经历过这样的场景:刚接手一个 TensorFlow 项目,却发现本地 Python 版本不兼容、CUDA 驱动缺失、Jupyter 启动报…

作者头像 李华
网站建设 2026/2/8 0:00:24

从瓶颈到突破:C++实现AIGC推理吞吐量提升的4大关键技术路径

第一章:从瓶颈到突破:C AIGC推理吞吐量提升的挑战与机遇在AIGC(AI Generated Content)应用快速发展的背景下,C作为高性能计算的核心语言,承担着关键的推理服务任务。然而,随着模型规模不断增大和…

作者头像 李华
网站建设 2026/2/7 8:46:24

手把手教你用Docker安装TensorFlow 2.9 GPU版本

手把手教你用Docker安装TensorFlow 2.9 GPU版本 在深度学习项目开发中,最让人头疼的往往不是模型设计本身,而是环境搭建——明明代码没问题,却因为CUDA版本不匹配、cuDNN缺失或Python依赖冲突导致import tensorflow直接报错。这种“在我机器…

作者头像 李华