Chapter-1 Memory Management (section 1.1-1.5)

news/2025/10/26 20:32:14/文章来源:https://www.cnblogs.com/juezhong/p/19167298

参考了 《打通 Linux 操作系统和芯片开发》 书籍的内容,实际也可以说是完全参照加上了个人的拙见或者是读书记录。
和我上一篇说的一样,我依然还是一个初学者,记录这些是自己梳理,以及想让文字发挥一些作用和意义。

涉及到代码的部分实在是非常非常的枯燥无味和无聊,并且由于 Linux 中函数的分层很多,call stack 特别深,函数名称特别相似,
非常容易头晕眼花了,所以还是应该采取从宏观角度的,抓住关键的函数调用链来进行分析和理解,不应该要求细节到某一行代码的程度,
否则陷入难解的困境了。

目录
  • 操作系统为什么需要内存管理?
  • 一级、二级页表映射过程
  • memblock 物理内存的初始化
    • memblock 的作用
    • memblock 的数据结构及代码分析

操作系统为什么需要内存管理?

这应该是一个很经典的问题,内存池 (Memory Pool) 也可以认为是一种内存管理的方式,所以关于内存管理四个字有点像谜底就在谜面上,更多的只是你如何管理的方式。
比如 FreeRTOS 中的好几种分配方式,常用的只是 heap_4.c 的方式,这种用在 MCU 上的方式可以比较简单,而对于现代的 2025 年的 MCU 可能依然还是比较小的内存,
至少没有上升到 4GB ,至少我还没接触到。并且芯片性能可能不强,无法负责和管理这么多的内存(后面出现了一个东西专门辅助此工作),所以操作系统采取了其他的方式来管理。

MCU 跑的都是在很小的内存中,大部分直接都是访问了物理地址,
所以简单的说为什么的原因,就是为了更好的利用和使用内存 这个相对比较快速的可以存数据的东西,才出现了内存管理的各种方式,一般在操作系统课程中都会提到在演进中出现的:

  • 分段机制(Segmentation)
  • 分页机制(Paging)

两种经典的方式,也可能听到 段页式 就是两种合并在一起说的。

Linux 采取的是分页的机制,同时根据书中描述是 四级页表 的形式,关于分段、分页的一些说明和概述及原理性这里就不详细说明,可以询问 ChatGPT 或是查看其他的文章,
这里仅添加一些可能重要的名词:

名词 翻译
换入 Swapping In
换出 Swapping Out
页面 Page
物理页面 Physical Page
页帧 Page Frame
页帧号 Page Frame Number (PFN)
虚拟页帧号 Virtual Page Frame Number (VPN)
物理页帧号 Physical Page Frame Number (PFN)
虚拟页面 Virtual Page
页表 Page Table (PT)
页表项 Page Table Entry (PTE)
内存管理单元 Memory Management Unit (MMU)
虚拟地址 Virtual Address
物理地址 Physical Address
转译后备缓冲器(快表) Translation Lookaside Buffer (TLB)
页全局目录 Page Global Direcotry (PGD)
页上级目录 Page Upper Directory (PUD)
页中间目录 Page Middle Direcotry (PMD)
页表 Page Table (PTE)
上面出现了但含义不一样
这里主要指Linux中多级页表的
页内偏移 Page offset

上面提到了一个专门辅助 Linux 做内存管理的东西就是 MMU 了(用来将虚拟地址转换成物理地址),现代的芯片一般都是将 MMU 内置在芯片中了,这是 Linux 运行的必备条件,所以 区别一个芯片能不能运行 Linux 系统,就是芯片有没有 MMU 这个模块了。

关于 MMU 如何寻址,如何管理,以及页表的映射和使用的过程,这里不多赘述,感兴趣的可以找操作系统相关课程学习,或者找 408 相关的学习视频参考。
另外重点是 Linux 一个页面的大小为 4KB 至于为什么是 4KB 的大小,AI 给出的答案是历史原因;还有就是想要运行 Linux 就需要 MMU 这个模块;

Linux 内存架构和模型略过,对理解关系不大不太重要

一级、二级页表映射过程

感觉实在是有必要的画一个一级、二级的页表映射的过程

二级页表只是在一级的基础上做了修改,添加了一个对一级页表的索引表,这样能对应的一级页表项就会更多了,而 Linux 用了四级来管理,数量就不计算了,同时这只是大致的示意,不代表就是这样的寻址。

对于 Linux 的多级页表管理不准备画图了,只不过是更多级,更复杂,更多控制位,更长的地址长度,但基本的方式是一样的。
简单说明就是首先将一个包含了虚拟页帧号的虚拟地址(线性地址)通过一系列查表的方式(查表的这个动作也可以是 MMU 在执行)转换成一个包含了物理页帧号的物理地址,(这里假设用到了 TLB ) 然后 MMU 通过查 TLB 快速的知道了物理页帧号与内存的某一块位置的对应关系,
然后就使用一下偏移量,在这一页中的偏移多少,就知道了这个虚拟地址的数据内容是多少了。
另外在这个过程中可能会产生一个 缺页中断 (Page Fault) ,简单说明即是在代码中使用 malloc 申请内存空间是在虚拟地址空间中,此时随便申请,实际上物理的内存条上对应映射的空间并不存在,或者说并没有数据内容,
或者当访问的页不在任何一个页表中,这个时候出现了缺页中断,此时才会从存储中加载到内存中,或者是正式的分配内存,这时候内存条上就有了空间和数据内容了,那么这正好也有页的换入(Swaping In)和换出(Swaping Out)两个动作。

memblock 物理内存的初始化

这部分有比较多的图和代码,太麻烦了,尝试通过文字来简单的叙述看看

memblock 的作用

Linux 中通过 Buddy 伙伴系统和 slab 分配器来分配和管理内存的,但是在此之前不可用的阶段,就由 memblock 来承担了初始化和管理的工作,所以自然的就想到这个阶段的 memblock 直接就是访问和管理的物理地址,
memblock 是唯一能做早期启动阶段管理内存的内存分配器,由此出现了 early boot memory 阶段的名称,是系统启动中间阶段的内存管理,这里涉及的内存模型不多赘述。

memblock 的数据结构及代码分析

书籍解析了代码的结构,只是简单解析了各部分的字段含义,详细可以直接让 AI 生成,注释内容 Gemini 2.5 Flash 生成:

include/linux/memblock.hstruct memblock {bool bottom_up;					/* 是否是自底向上? */phys_addr_t current_limit;		/* 当前限制地址 */struct memblock_type memory;	/* 可用内存区域 */struct memblock_type reserved;	/* 保留内存区域 */
};struct memblock_type {unsigned long cnt; 				 /* 区域计数 */unsigned long max; 				 /* 最大区域数 */phys_addr_t total_size; 		 /* 总大小 */struct memblock_region *regions; /* 区域数组 */char *name;						 /* 类型名称 */
};struct memblock_region {phys_addr_t base;		 	/* 区域基地址 */phys_addr_t size; 			/* 区域大小 */enum memblock_flags flags; 	/* 区域标志 */
#ifdef CONFIG_NUMAint nid; /* NUMA节点ID */
#endif
};enum memblock_flags {MEMBLOCK_NONE			= 0x0,	/* 无特殊请求 */MEMBLOCK_HOTPLUG		= 0x1,	/* 可热插拔区域 */MEMBLOCK_MIRROR			= 0x2,	/* 镜像区域 */MEMBLOCK_NOMAP			= 0x4,	/* 不添加到内核直接映射 */MEMBLOCK_DRIVER_MANAGED = 0x8,	/* 总是通过驱动检测 */MEMBLOCK_RSRV_NOINIT	= 0x10,	/* 不初始化struct pages */
};

接着从 stark_kernel 入手,主要关注了 setup_arch 函数,参数是 command_line,贴出函数:

// 只给出相对重要的函数调用
arch/arm64/kernel/setup.cvoid __init __no_sanitize_address setup_arch(char **cmdline_p)
{setup_initial_init_mm(_stext, _etext, _edata, _end);*cmdline_p = boot_command_line;... ...early_fixmap_init();early_ioremap_init();setup_machine_fdt(__fdt_pointer);... ...arm64_memblock_init();paging_init();... ...bootmem_init();... ...
}

Gemini 2.5 Flash:

  1. setup_initial_init_mm

    • 初始化内核的第一个内存描述符 init_mm
    • 主要用于设置内核代码 (_stext, _etext) 和数据段 (_edata, _end) 的内存范围。
  2. *cmdline_p = boot_command_line

    • 将系统启动时传递的命令行参数 (boot_command_line) 赋值给 cmdline_p 指针。
    • 这使得后续的内核组件能够访问和解析启动参数。
  3. early_fixmap_init

    • 初始化早期固定映射(fixmap)区域。
    • 用于在启动初期为特定的、固定地址的内存区域建立虚拟地址映射,通常用于访问一些关键的硬件寄存器或数据结构。
  4. early_ioremap_init

    • 初始化早期 I/O 内存重映射机制。
    • 允许内核在启动初期安全地访问和映射设备 I/O 空间,例如外设控制器的寄存器。
  5. setup_machine_fdt(__fdt_pointer)

    • 根据设备树(Flattened Device Tree, FDT)设置机器相关的参数和配置。
    • 解析由 __fdt_pointer 指向的设备树,从中获取硬件信息、设备配置等,以初始化系统。
  6. arm64_memblock_init

    • 初始化 ARM64 架构的内存块(memblock)管理机制。
    • 用于在内核启动早期跟踪和管理物理内存区域,包括可用内存和保留内存。
  7. paging_init

    • 初始化页表和内存分页机制。
    • 建立将物理内存映射到虚拟地址空间的页表结构,这是现代操作系统内存管理的基础。
  8. bootmem_init

    • 初始化 bootmem 分配器。
    • 这是一个简单的物理内存分配器,在内核启动的早期阶段(分页机制刚建立,但更复杂的内存管理系统尚未完全初始化时)用于分配物理内存。

接着继续分析了 setup_machine_fdt 函数:

static void __init setup_machine_fdt(phys_addr_t dt_phys)
{int size;void *dt_virt = fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL);const char *name;if (dt_virt)memblock_reserve(dt_phys, size);if (!early_init_dt_scan(dt_virt, dt_phys)) {pr_crit("\n""Error: invalid device tree blob at physical address %pa (virtual address 0x%px)\n""The dtb must be 8-byte aligned and must not exceed 2 MB in size\n""\nPlease check your bootloader.",&dt_phys, dt_virt);while (true)cpu_relax();}/* Early fixups are done, map the FDT as read-only now */fixmap_remap_fdt(dt_phys, &size, PAGE_KERNEL_RO);name = of_flat_dt_get_machine_name();if (!name)return;pr_info("Machine model: %s\n", name);dump_stack_set_arch_desc("%s (DT)", name);
}

该函数主要功能是:

  • 拿到 DTB 的物理地址后,会通过 fixmap_remap_fdt() 进行映射,其中包括 pgdpudpte 等映射(书中这部分是否漏了 pmd ?),当映射完成后会返回 dt_virt,并通过 memblock_reserve() 添加到 memblock.reserved 中。
  • early_init_dt_scan() 通过解析 DTB 文件的 memory 节点获得可用物理内存的起始地址和大小,并通过类 memblock_add 的 API 向 memory.regions 数组添加一个 memblock.region 实例,用于管理这个物理内存的区域。

接着是 arm64_memblock_init 函数,其主要工作是将物理内存进行整理,将一些特殊区域添加到 reserved 内存中,主要是设备树中的:chosenchosen(cma)reserved-memory/memreservechosen(initrd) 节点。

这部分的代码工作大体将物理内存进行了分区和简单的管理,后续需要进行重要的 内存页表映射 完成物理地址到虚拟地址的映射,书中说系统完成初始化之后,所有的工作会移交给 Buddy 系统来进行内存管理。

—— juezhong 乙巳年丙戌月戊辰日 戌时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/947021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完整教程:在线教程丨百倍提速,中科院团队发布首个国产类脑脉冲大模型SpikingBrain-1.0,推理效率数量级提升

完整教程:在线教程丨百倍提速,中科院团队发布首个国产类脑脉冲大模型SpikingBrain-1.0,推理效率数量级提升pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

10/26/2025 一周总结

10/20/2025 杂题 对于一些多项式相关的问题(比如低次多项式的幂),可以考虑导数或者积分之后再求,可能会有一些比较好的效果。 10/21/2025 模拟赛 T1 有点抽象,做了两个半小时,也不是正解,但是感觉挺对的,最后过…

2025年饮料包装设备厂家权威推荐榜:缠膜机/吹瓶机/膜包机/杀菌机/水处理/套标机/贴标机/洗瓶机/卸垛机/旋盖机/液氮机/装箱机/灌装生产线专业解析

2025年饮料包装设备厂家权威推荐榜:缠膜机/吹瓶机/膜包机/杀菌机/水处理/套标机/贴标机/洗瓶机/卸垛机/旋盖机/液氮机/装箱机/灌装生产线专业解析 行业背景与发展趋势 随着全球饮料行业的持续增长,包装设备市场正迎来…

【API接口】最新可用抖音搜索接口

最新可用抖音搜索接口,实现抖音官方同款搜索功能,数据与官方同步,为开发者和内容创作者提供便捷的抖音短视频搜索功能 使用之前您需要先去注册下key 申请地址: https://www.52api.cn 接口地址:https://www.52api…

2025 年 10 月门窗十大品牌榜单揭晓,技术研发实力与市场口碑全景解析

2025 年 10 月门窗十大品牌榜单由中国建筑金属结构协会、全国工商联家具装饰业商会联合发布,本次评选突破传统单一指标局限,构建 “技术研发实力 + 市场口碑” 双维度全景评估体系。技术维度以《铝合金门窗》(GB/T …

2025年摩托车/机车厂家权威推荐榜:专业制造工艺与骑行性能深度解析,精选实力品牌及选购指南

2025年摩托车/机车厂家权威推荐榜:专业制造工艺与骑行性能深度解析,精选实力品牌及选购指南 行业背景与发展趋势 摩托车制造业正经历着深刻的技术变革与产业升级。随着新能源技术的普及和智能控制系统的广泛应用,现…

Valueof数据类型转换

int或其他数字类型转字符串就用String xxx = String.valueof(数字)

妙题合集

前言:本合集主要用于记录编者在学习过程中碰到的各种数学妙题。“妙”并没有什么具体的标准,主要就以思路新颖、有具体的极“妙”的某一步。 求证:$641 \mid 2{2k } +1 $

个人 Windows 电脑本地部署运行 DeepSeek 大模型

1、大模型管理器 1.1、下载ollama 官网下载地址:https://ollama.com/download如上图所示,下载 Windows 操作系统版本的 ollama 安装包。 1.2、安装ollama如上图所示,以“管理员身份运行”安装包。如上图所示,允许安…

2025年环保设备厂家权威推荐榜:废气处理、废水处理、噪音治理一站式解决方案,专业实力与高效服务深度解析

2025年环保设备厂家权威推荐榜:废气处理、废水处理、噪音治理一站式解决方案,专业实力与高效服务深度解析 行业背景与发展趋势 随着我国生态文明建设的深入推进,环保产业正迎来前所未有的发展机遇。作为环保产业的重…

生物信息与育种-全基因组选择/预测(GS/GP)合集【持续更新~】

系列报告 基因组选择(GS)让育种进入预测时代 全基因组选择:理论探讨 基因组选择(GS)如何加速作物遗传增益? Computomics:利用先进的机器学习实现预测性植物育种 基因组选择:加速遗传增益,缩短育种周期 基因组…

2025年锡膏厂家推荐排行榜,激光焊接锡膏,金锡Au-Sn锡膏,铟银锡合金高导热锡膏,水洗型锡膏,高温高铅锡膏,硅麦锡锑划线喷涂锡膏,Mini LED固晶锡膏,6号7号8号超细粉锡膏

2025年锡膏厂家推荐排行榜:激光焊接锡膏、金锡Au-Sn锡膏等特种焊接材料深度解析 行业背景与市场格局 电子焊接材料行业作为电子信息产业链的关键环节,正经历着深刻的技术变革与市场重构。随着5G通信、人工智能、物联…

2025 年 10 月门窗十大品牌榜单揭晓,技术创新实力与市场口碑双重透视

2025 年 10 月门窗十大品牌榜单由中国建筑金属结构协会、全国工商联家具装饰业商会联合重磅发布。本次榜单突破传统评选局限,以《铝合金门窗》(GB/T 8478-2008)为基础技术标准,创新性构建 “技术硬实力 + 市场口碑…

一个用于从头发现植物转录因子结合位点的可解释生成式深度学习系统

分享一篇由阿三团队近期发表在Plant Commun上的文章:PTF-Vāc: An explainable and generative deep co-learning encoders-decoders system) for ab-initio discovery of plant transcription factor binding sites。…

拜耳作物科学提出一种生物学引导的神经网络框架用于基因组选择(GS)

分享一篇2025年10月16日由拜耳旗下的拜耳作物科学公司在arxiv预印本上发表的文章:Biology-informed neural networks learn nonlinear representations from omics data to improve genomic prediction and interpret…

如何利用AI挖掘基因?一个很好的水稻例子

分享一篇近期由海南大学王华锋教授团队发表在International Journal of Biological Macromolecules(IF=8.5,JCR1)上的文章:Machine learning and functional validation identify OsRAV11/12 as negative regulato…

AI如何影响生物信息学的职业生涯?

分享一篇2025年10月13日来自Nature的职业专栏文章,题为《“我是否多余了?”——人工智能如何改变我在生物信息学的职业生涯》,作者是Lei Zhu。文章探讨了人工智能工具在生物信息学领域的崛起如何重塑研究者的角色,…

一个通过深度学习整合多组学功能注释的基因组预测模型DeepAnnotation

分享一篇2025年8月28日由中国农业科学院深圳农业基因组研究所刘毓文课题组在《GigaScience》上发表题为“DeepAnnotation: A novel interpretable deep learning–based genomic selection model that integrates comp…

如何整合多组学数据并利用机器学习算法进行基因组预测?

分享一篇中国农科院深圳基因组所周永锋老师团队发表在JGG上的文章:Integrative multi-omics and genomic prediction reveal genetic basis of early salt tolerance in alfalfa,研究了紫花苜蓿(Medicago sativa L.…

DPCformer:一种用于作物基因组预测的可解释深度学习模型

分享一篇2025年10月9日由华中农业大学国家作物遗传改良重点实验室在arxiv预印本上发表的文章:DPCformer: An Interpretable Deep Learning Model for Genomic Prediction in Crops。该研究开发了一种名为DPCformer的新…