当前位置: 首页 > news >正文

Linux 内核基础统简全解:Kbuild、内存分配和地址映射


📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry


Linux 内核基础统简全解:Kbuild、内存分配和地址映射

Linux 内核基础知识似乎分散,但其实只要理清基本概念和应用场景,就能从完整结构观得到进程、内存、构建等多个角度的组合结果。本文将进行一段精简且全面的分析,实现概念 + 分析 + 示意图的组合,方便理解和记录。


在这里插入图片描述

一、Kbuild 是什么?

Kbuild 是 Linux 内核中用于描述每个相关源码目录应该怎样装配、编译和打包成内核或模块的组建机制。

虽然每个子目录中的文件名为 Makefile,但其内容采用的是 Kbuild 特有语法,与传统 GNU Make 不同,因此通称为 Kbuild 文件

Kbuild 基础用法

语法写法含义
obj-y += foo.o内存编译,装入核心
obj-m += bar.o编译为模块 bar.ko
foo-objs := a.o b.ofoo.o 由多个完成单元构成
obj-$(CONFIG_XXX) += z.o根据 Kconfig 选项条件编译

示例:

obj-$(CONFIG_MYDEV) += mydriver.o
mydriver-objs := main.o helper.o
  • 当配置中启用 CONFIG_MYDEV,则构建模块 mydriver.ko
  • 该模块由 main.chelper.c 构成

构建进程流程图

make menuconfig↓
生成 .config 含 CONFIG_XXX↓
项目核心 Makefile 分析↓
递归读取各目录 Makefile (Kbuild)↓
构建 .o / .ko 相应目标

二、kmalloc 和 vmalloc 有什么区别?

对比项kmallocvmalloc
虚拟地址是否连续
物理地址是否连续是 (DMA 选择)否 (paged memory)
性能高,直接映射较低,页表查找、TLB 影响
配置大小小(如 <1MB)可以配置大块内存 (四级 MB)
通用场景控制块,快速切换区块大存储区,如图像 buffer 、清洗区

示意图:

kmalloc:[虚拟地址] 连续[物理地址] 连续vmalloc:[虚拟地址] 连续[物理地址] 分散

三、什么是“直接映射区”?和“低端内存”有关吗?

概念

  • 直接映射区:一段内核虚拟地址空间,对应于物理内存的线性映射,无页表转换,直接可用
  • 低端内存:指可被直接映射区映射的部分物理内存,通常是前 896MB

使用场景

  • virt_to_phys() 只能转换直接映射区内存
  • kmalloc 得到的地址在直接映射区,因此能做 DMA

四、用户端请求的内存是否需要内核端重新分配?

答:不需要内核端重新分配,内核仅通过 页表将用户虚拟地址映射到物理页并创建映射关系即可

示意图

用户地址   →    页表映射    →     物理页malloc()                     内核分配               不需内核地址

五、代码运行时在内存中被分到哪些段?

段名内容
.text程序代码区域
.data已初始化全局变量
.bss未初始化全局变量
.rodata常量数据(如字符串)
heap动态分配的 malloc 区
stack层级调用、局部变量

六、Kconfig 中的 selectdepends on 有什么区别?

语法含义
depends on A表示依赖,A 未选则本项不可选
select A强制选中,选择本项时会自动启用 A,但 不检查 A 依赖

示意示例

config FOObool "Enable FOO"depends on BARselect BAZ
  • 表示:只有 BAR=y 时才能选 FOO
  • 选 FOO 时会强制选择 BAZ

如需可以继续扩展:

  • 全套 Kbuild 子目录结构分析
  • Kbuild 和 Kconfig 实际使用连动
  • 内核地址映射和页表架构运行图

如需我可以为你生成配套实例、导图或按章节列表。


📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry


http://www.dtcms.com/a/295947.html

相关文章:

  • 10分钟搭建脚手架:Spring Boot 3.2 + Vue3 前后端分离模板
  • Springboot儿童医院问诊导诊系统aqy75(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 使用钉钉开源api发送钉钉工作消息
  • C语言 一文详解常用的字符串操作函数及模拟实现
  • 医疗系统国产化实录:SQL Server国产替代,乙方保命指南
  • DigitalOcean 一键模型部署,新增支持百度开源大模型ERNIE 4.5 21B
  • 集合中Comparable接口和Equals方法的冲突
  • 【Mermaid 离线工具】Mermaid 流程图生成器 - 高清PNG输出,一键生成专业级流程图!
  • 共创养生新时代——2025酵素益生产品展暨中秋滋补选品节即将开启
  • QT6 源(165)模型视图架构里的所有的信号函数概览
  • UNETR++: Delving Into Efficient and Accurate 3D Medical Image Segmentation
  • 深度分析Java内存模型
  • 【全新上线】境内 Docker 镜像状态监控
  • 算法第三十八天:动态规划part06(第九章)
  • 【shell脚本编程】day1 备份指定文件类型
  • Unreal5从入门到精通之 动画蓝图 快速入门
  • ML1-ETO 阳性白血病的复发与 LSC 的持续存在密切相关
  • 2025智能BI⼯具竞品深度解析:DataFocus如何挑Tableau与PowerBI的霸主地位?
  • OpenCV图像插值、边缘填充、图像掩膜、噪声消除实战指南
  • 华为仓颉编程语言的表达式的特点
  • 网安学习NO.18
  • 深入掌握CSS Grid布局:每个属性详解与实战示例
  • MySQL 8.4.4详细下载安装配置
  • 【论文阅读】REVISITING DEEP AUDIO-TEXT RETRIEVAL THROUGH THE LENS OF TRANSPORTATION
  • 全面解析 CSS Flex 布局:从入门到精通的所有属性详解
  • DeepSeek-R1+豆包迭代一次完成中国象棋游戏
  • Qwen3-Coder实现中国象棋游戏的尝试
  • Java网络编程入门:从基础原理到实践(二)
  • 计算机网络简答题(大雪圣期末参考资料)
  • Redis哨兵模式(Sentinel)底层实现原理详细介绍