Linux 内核配置机制详细讲解
本文是对 Linux 内核配置机制 make menuconfig 的 超详细分步解析,涵盖其工作原理、界面操作、配置逻辑及底层实现:
一、内核配置系统概述
Linux 内核的配置系统是一个 基于文本的交互式配置工具链,核心目标是通过定义 CONFIG_XXX 宏来控制内核功能的编译行为。make menuconfig 是其中最常用的 基于ncurses库的图形化配置界面。
1. 配置系统的三个层次
| 工具 | 特点 | 适用场景 |
|---|---|---|
make config | 纯命令行逐项问答 | 极简环境 |
make menuconfig | 基于ncurses的TUI界面 | 交互式配置(最常用) |
make xconfig | 基于Qt的GUI界面 | 图形桌面环境 |
2. 核心文件结构
内核源码根目录/
├── .config # 当前配置文件(隐藏文件)
├── arch/ # 架构相关配置
│ └── */configs/ # 各架构的预设配置
├── scripts/kconfig/ # 配置系统核心代码
├── include/config/ # 生成的自动头文件
└── Kconfig # 顶层Kconfig文件
二、make menuconfig 界面详解
1. 启动方式
cd /path/to/linux-kernel
make menuconfig
2. 界面布局
┌───────────────────────── Linux Kernel Configuration ────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus. │
│ Highlighted letters are hotkeys. Pressing <Y> includes, <N> excludes, │
│ <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help. │
│ ┌──────────────────────────────────────────────────────────────────────────┐ │
│ │ [*] 64-bit kernel │ │
│ │ [*] Enable loadable module support ---> │ │
│ │ [*] Enable the block layer ---> │ │
│ │ Processor type and features ---> │ │
│ │ Power management and ACPI options ---> │ │
│ │ Bus options (PCI etc.) ---> │ │
│ │ Executable file formats / Emulations ---> │ │
│ │ [*] Networking support ---> │ │
│ │ Device Drivers ---> │ │
│ │ Firmware Drivers ---> │ │
│ │ File systems ---> │ │
│ │ Kernel hacking ---> │ │
│ └──────────────────────────────────────────────────────────────────────────┘ │
│ <Select> < Exit > < Help > │
└──────────────────────────────────────────────────────────────────────────────┘
各部分功能:
- 顶部菜单栏:显示当前菜单路径(如
Main Menu -> Device Drivers -> USB support) - 左侧菜单树:层次化展示所有配置项,使用
--->表示有子菜单 - 右侧帮助区:显示当前选中项的详细说明
- 底部状态栏:显示操作快捷键提示
三、配置项类型与符号
1. 配置项类型
| 符号 | 类型 | 说明 |
|---|---|---|
[*] | bool (布尔值) | 功能编译进内核(CONFIG_XXX=y) |
< > | tristate (三态) | 可编译为模块(CONFIG_XXX=m) |
( ) | bool (单选) | 互斥选项组,只能选择一个 |
{M} | 模块依赖 | 该模块依赖其他选项被启用 |
-*- | 强制启用 | 该选项必须被启用 |
(value) | int/hex/string | 数值、十六进制或字符串类型的配置 |
2. 操作快捷键
| 快捷键 | 功能 |
|---|---|
| 方向键 | 导航菜单项 |
| Enter | 进入子菜单/确认编辑 |
| Y | 启用当前选项(编译进内核) |
| N | 禁用当前选项(不编译) |
| M | 编译为模块(仅限三态选项) |
| 空格 | 循环切换选项状态(Y/N/M) |
| / (斜杠) | 搜索配置项 |
| Esc Esc | 退出当前菜单/退出配置界面 |
| ? | 显示帮助信息 |
四、Kconfig 语法基础
配置项的定义通过 Kconfig 文件实现,每个目录的 Kconfig 文件定义该目录的配置选项。
示例代码分析
# 在 drivers/usb/Kconfig 中
menu "USB support"depends on HAS_IOMEMconfig USBtristate "USB support"default yhelpUniversal Serial Bus (USB) is a specification for communicationbetween devices and a host controller. This option is needed forUSB host and device drivers.if USBconfig USB_DEBUGbool "USB verbose debug messages"depends on DEBUG_FShelpSay Y here if you want the USB core to produce debug messages.endif # USB
endmenu
语法元素:
- menu/endmenu:定义一个菜单块
- config:定义一个配置项
- depends on:声明依赖条件
- default:设置默认值
- help:添加帮助文档
- if/endif:条件块控制
五、配置文件的生成与处理
1. .config 文件格式
# 注释行以 # 开头
CONFIG_LOCALVERSION="-custom"
CONFIG_SYSVIPC=y
CONFIG_POSIX_MQUEUE=y
CONFIG_USB=m
# CONFIG_USB_DEBUG is not set
2. 自动生成头文件
执行 make 后,配置系统会生成:
include/generated/autoconf.h # 所有CONFIG_XXX宏定义
include/config/auto.conf | 供Makefile使用的配置
include/config/tristate.conf |
3. 依赖关系处理
配置系统通过以下机制保证一致性:
- 正向依赖:
depends on确保父选项启用时子选项可用 - 反向依赖:
select强制启用其他选项 - 范围检查:
range限制数值型配置的取值范围 - 冲突检测:
conflict防止互斥选项同时启用
六、高级操作技巧
1. 基于现有配置修改
cp /boot/config-$(uname -r) .config # 复制当前系统配置
make menuconfig # 基于现有配置修改
2. 预设配置选项
scripts/config --set-val CONFIG_XXX y # 命令行修改配置
make olddefconfig # 应用默认值填充未设置的选项
3. 配置差异分析
diff .config.old .config.new # 比较两个配置文件差异
4. 环境变量预设
export KCONFIG_CONFIG=myconfig # 指定自定义配置文件
export KCONFIG_OVERWRITECONFIG=1 # 强制覆盖原.config
七、注意事项
- 不要手动编辑
.config:应始终通过配置工具修改 - 处理
CONFIG_DEBUG_INFO:启用会显著增大内核体积 - 模块化权衡:关键功能(如文件系统驱动)建议编译进内核
- 架构特定选项:通过
ARCH=arm make menuconfig指定架构 - 配置冲突处理:仔细阅读错误提示,解决依赖关系
通过上述机制,Linux 内核实现了 高度可定制性 和 跨平台支持能力。建议初次配置时参考发行版提供的默认配置(位于 arch/*/configs/),逐步熟悉各子系统的关系。
相关文章:
Linux 内核配置机制详细讲解
本文是对 Linux 内核配置机制 make menuconfig 的 超详细分步解析,涵盖其工作原理、界面操作、配置逻辑及底层实现: 一、内核配置系统概述 Linux 内核的配置系统是一个 基于文本的交互式配置工具链,核心目标是通过定义 CONFIG_XXX 宏来控制内…...
【C语言】第八期——指针、二维数组与字符串
目录 1 初始指针 2 获取变量的地址 3 定义指针变量、取地址、取值 3.1 定义指针变量 3.2 取地址、取值 4 对指针变量进行读写操作 5 指针变量作为函数参数 6 数组与指针 6.1 指针元素指向数组 6.2 指针加减运算(了解) 6.2.1 指针加减具体数字…...
Spring Boot集成Spring Security之HTTP请求授权
一、HTTP请求授权工作原理 基于Spring Security最新的Http请求授权讲解,不再使用旧版的请求授权 授权过滤器AuthorizationFilter获取认证信息 调用RequestMatcherDelegatingAuthorizationManager的check方法验证该用户是否具有该请求的授权 RequestMatcherDele…...
可以免费无限次下载PPT的网站
前言 最近发现了一个超实用的网站,想分享给大家。 在学习和工作的过程中,想必做PPT是一件让大家都很头疼的一件事。 想下载一些PPT模板减少做PPT的工作量,但网上大多精美的PPT都是需要付费才能下载使用。 即使免费也有次数限制࿰…...
DeepSeek 开源周:DeepEP 项目详解,GPU 压榨计划启动!
引言 就在今天,2025年2月25日,DeepSeek 再次为人工智能社区带来了一场技术盛宴——DeepEP 项目的开源。这个旨在优化 GPU 性能的工具一经发布便迅速获得了广泛的关注和赞誉,短短两小时内就斩获了超过1000个 Star。本文将详细介绍 DeepEP 的功…...
GPT1 与 GPT2 的异同
1.什么是GPT1: GPT1介绍了一种通过生成式预训练(Generative Pre-Training)来提升语言理解能力的方法。这种方法首先在一个大型的未标注文本语料库上进行语言模型的预训练,然后针对具体的任务进行判别式微调(discrimin…...
从零开始自主「起身站立」,上海AI Lab发布最新控制算法,机器人:起猛了
来源 | 机器之心 近日,上海 AI Lab 具身智能中心研究团队在机器人控制领域取得了最新突破,提出的 HoST(Humanoid Standing-up Control)算法,成功让人形机器人在多种复杂环境中实现了自主站起,并展现出强大…...
基于Python socket库构建的基于 P2P 的文件共享系统示例
基于 P2P 的文件共享系统 实现方式: 使用 Python 的socket库构建 P2P 网络,节点之间通过 TCP 或 UDP 协议进行通信。每个节点维护一个文件列表,并向其他节点广播自己拥有的文件信息。当一个节点需要某个文件时,它会向网络中的其…...
【Kubernetes】API server 限流 之 maxinflight.go
这个文件实现了一个基于信号量(Channel)的简单限流器。 基础知识 总共有四种channel 带缓冲的channel nonMutatingChan、mutatingChan 都是带缓冲的channel ,这类channel 的特点是: 这允许最多 mutatingLimit /nonMutatingLimit 个请求同时获取令牌并执…...
Solr中得Core和Collection的作用和关系
Solr中得Core和Collection的作用和关系 一, 总结 在Apache Solr中,Core和Collection 是两个核心概念,他们分别用于单机模式和分布式模式(SolrCloud)中,用于管理和组织数据。 二,Core 定义&am…...
AI驱动的自动化留给人类的时间不多了
时间紧迫!时间紧迫!时间紧迫! 关于AI工作流催生的行业任务自动化时间窗口,结合技术成熟度、成本效益、行业特性等维度,可划分为以下阶段: 一、技术渗透阶段(2025-2028年) 高重复性任…...
嵌入式Qt的动平衡仪完整设计方案
一、系统架构总览 #mermaid-svg-R5q0e12ntMzsskep {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-R5q0e12ntMzsskep .error-icon{fill:#552222;}#mermaid-svg-R5q0e12ntMzsskep .error-text{fill:#552222;stroke:#5…...
使用 Containerd 通过 HTTP 协议拉取 Harbor 私有镜像仓库的镜像
在 Kubernetes 1.24及以上版本环境中,docker不再被支持,主要使用Containerd 是常用的容器运行。默认情况下,Containerd 使用 HTTPS 协议与镜像仓库通信。然而,在某些场景下(如测试环境或内部网络)ÿ…...
Python解决“比赛配对”问题
Python解决“比赛配对”问题 问题描述测试样例解决思路代码 问题描述 小R正在组织一个比赛,比赛中有 n 支队伍参赛。比赛遵循以下独特的赛制: 如果当前队伍数为 偶数,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,…...
Dify在Ubuntu20.04系统的部署
文章目录 一、dify 介绍1.核心功能优势2.应用场景 二、dify 安装(docker方式)1.代码库下载2.配置文件修改3.启动docker 容器 三、遇到问题与解决1.使用sudo docker compose up -d报错2.使用service docker start报错 一、dify 介绍 Dify 是一款开源的大语言模型(LL…...
达梦:内存相关参数
目录 28个相关参数1. 内存池相关MEMORY_POOLMEMORY_N_POOLSMEMORY_BAK_POOL 2. 大缓冲区相关HUGE_BUFFERHUGE_BUFFER_POOLS 3. 共享缓冲区相关BUFFERBUFFER_POOLSBUFFER_MODEMAX_BUFFER 4. 快速池相关FAST_POOL_PAGES 5. 回收池相关RECYCLE_POOLS 6. 回滚段池相关ROLLSEG_POOLS…...
计算机毕设-基于springboot的融合多源高校画像数据与协同过滤算法的高考择校推荐系统的设计与实现(附源码+lw+ppt+开题报告)
博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…...
《Qt动画编程实战:轻松实现头像旋转效果》
《Qt动画编程实战:轻松实现头像旋转效果》 Qt 提供了丰富的动画框架,可以轻松实现各种平滑的动画效果。其中,旋转动画是一种常见的 UI 交互方式,广泛应用于加载指示器、按钮动画、场景变换等。本篇文章将详细介绍如何使用 Qt 实现…...
SpringBoot3—快速入门
一、简介 (1)前置知识 Java17Spring、SpringMVC、MyBatisMaven、IDEA (2)环境要求 (3)SpringBoot3是什么 核心概念:Spring Boot 底层是 Spring,能简单、快速地创建一个独立的、生…...
【Eureka 缓存机制】
今天简单介绍一下Eureka server 的缓存机制吧✌️✌️✌️ 一、先来个小剧场:服务发现的"拖延症" 想象你是个外卖小哥(客户端),每次接单都要打电话问调度中心(Eureka Server):“现在…...
Python基于机器学习的微博舆情情感分析系统,微博评论情感分析可视化系统(全新升级)
大家好,今天为大家带来的是Python基于机器学习的微博舆情情感分析系统,微博评论情感分析可视化系统,这个系统在原本的系统上进行优化升级。 算法从开源框架的 snlow ,到支持机器学习的 lstm 算法可以手动输入语句,进行…...
Matlab地图绘制教程第2期—水陆填充图
上一期分享了海岸线图的绘制方法: 本着由浅入深的理念,本期再来分享一下水陆填充图的绘制方法。 先来看一下成品效果: 特别提示:Matlab地图绘制教程系列,旨在降低大家使用Matlab进行地图类科研绘图的门槛,…...
云创智城YunCharge 新能源二轮、四轮充电解决方案(云快充、万马爱充、中电联、OCPP1.6J等多个私有单车、汽车充电协议)之新能源充电行业系统说明书
云创智城YunCharge 新能源充电行业系统说明书 ⚡官方文档 ⚡官网地址 1. 引言 随着全球环境保护和能源危机的加剧,新能源汽车行业得到了快速发展,充电基础设施建设也随之蓬勃发展。新能源充电行业系统旨在提供高效、便捷的充电服务,满足电…...
(八)Java-Collection
一、Collection接口 1.特点 Collection实现子类可以存放多个元素,每个元素可以是Object; 有些Collection的实现类,可以存放重复的元素,有些不可以; 有些Collection的实现类,有些是有序的(Li…...
小程序高度问题背景scss
不同的机型,他的比例啥的都会不一样,同样的rpx也会有不同的效果。所以这里选择了取消高度。 <view class"box-border" :style"{padding-top: ${navHeight}px,}"><!-- 已登录 --><view v-if"userStore.userInfo&…...
HTML 日常开发常用标签
文章目录 HTML 日常开发常用标签1、基本结构标签2、内容标签3、多媒体标签4、表单标签5、列表和定义标签6、表格标签7、链接和图像8、元数据9、语义化标签(HTML5新增)10、框架和内联11、交互12、过时或不推荐使用的标签 HTML 日常开发常用标签 1、基本结…...
vue3表单验证的时候访问接口如果有值就通过否则不通过.主动去触发校验
页面有个身份证号码的校验。校验完身份证格式是否符合之后还要去访问接口查询这个用户是否存在。如果存在才通过验证。否则就校验不通过 <el-form ref"ruleFormRef" :model"form" label-width"140px" label-position"right" label…...
Cuppa CMS v1.0 任意文件读取(CVE-2022-25401)
漏洞简介: Cuppa CMS v1.0 administrator/templates/default/html/windows/right.php文件存在任意文件读取漏洞 漏洞环境: 春秋云镜中的漏洞靶标,CVE编号为CVE-2022-25401 漏洞复现 弱口令行不通 直接访问administrator/templates/defau…...
C# Dictionary 使用指南
C# Dictionary 使用指南 1. 简介 Dictionary<TKey, TValue> 是 C# 中一个非常常用的泛型集合类,用于存储键值对(Key-Value Pair)。它可以根据键快速查找对应的值,因此在需要快速查找和检索数据的场景下非常高效。 2. 基本…...
基于Spark的电商供应链系统的设计与实现
目录 1.研究背景与意义 2、国内外研究现状 3、相关理论与技术 (一)分布式计算系统Spark (二)数据仓库Hive (三)读取服务器本地磁盘的日志数据Flume (四)分布式消息队列Kafka …...
