一步一图带你深入明确 Linux 物理内存管理(上)

藏宝库编辑 2024-9-12 05:14:46 65 0 来自 中国
1. 前文回顾

在上篇文章 《深入明确 Linux 捏造内存管理》 中,笔者分别从历程用户态和内核态的角度具体深入地为各人先容了 Linux 内核怎样对历程捏造内存空间举行结构以及管理的相干实现。在我们深入明确了捏造内存之后,那么何不顺带着也探秘一下物理内存的管理呢?
以是本文的目的是在深入明确捏造内存管理的根本之上继承带各人向前奋进,一举击破物理内存管理的知识盲区,使各人可以或许俯瞰整个 Linux 内存管理子体系的团体全貌。
而在正式开始物理内存管理的主题之前,笔者觉得有必须在带各人回顾下上篇文章中先容的捏造内存管理的相干知识,方便各人来回对比捏造内存和物理内存,从而可以全面团体地把握 Linux 内存管理子体系。
在上篇文章的一开始,笔者起首为各人显现了我们应用程序频仍打仗到的捏造内存所在,清楚地为各人先容了到底什么是捏造内存所在,以及捏造内存所在分别在 32 位体系和 64 位体系中的具体体现情势:
1.png 在我们清楚了捏造内存所在这个根本概念之后,随后笔者又抛出了一个题目:为什么我们要通过捏造内存所在访问内存而不是直接通过物理所在访问?
原来是在多历程体系中直接操纵物理内存所在的话,我们须要精确地知道每一个变量的位置都被安排在了哪里,而且还要留意当前历程在和多个历程同时运行的时间,不能共用同一个所在,否则就会造成所在辩说。
而捏造内存空间的引入正是为相识决多历程所在辩说的题目,使得历程与历程之间的捏造内存所在空间相互隔离,互不干扰。每个历程都以为自己独占所有内存空间,将多历程之间的协同相干细节齐备交给内核中的内存管理模块来处置惩罚,极大地解放了程序员的心智负担。这一切都是因为捏造内存可以或许为历程提供内存所在空隔断离的功劳。
4.png 在我们清楚了捏造内存空间引入的意义之后,笔者紧接着为各人先容了历程用户态捏造内存空间分别在 32 位呆板和 64 位呆板上的结构情况:
在相识了用户态捏造内存空间的结构之后,紧接着我们又先容了 Linux 内核怎样对用户态捏造内存空间举行管理以及相应的管理数据结构:
在先容完用户态捏造内存空间的结构以及管理之后,我们随后又先容了内核态捏造内存空间的结构情况,并团结之前先容的用户态捏造内存空间,得到了 Linux 捏造内存空间分别在 32 位和 64 位体系中的团体结构情况:
在捏造内存全部先容完毕之后,为了可以或许承上启下,于是笔者继承在上篇文章的末了一个末节从盘算机构成原理的角度先容了物理内存的物理组织结构,方便让各人明确到底什么是真正的物理内存 ?物理内存所在到底是什么 ?由此为本文的主题 —— 物理内存的管理 ,埋下伏笔~~~
10.png 末了笔者先容了 CPU 怎样通过物理内存所在向物理内存读写数据的完备过程:
在我们回顾完上篇文章先容的用户态和内核态捏造内存空间的管理,以及物理内存在盘算机中的真实构成结构之后,下面笔者就来正式地为各人先容本文的主题 —— Linux 内核怎样对物理内存举行管理
12.png 2. 从 CPU 角度看物理内存模子

在前边的文章中,笔者曾多次提到内核是以页为根本单元对物理内存举行管理的,通过将物理内存分别为一页一页的内存块,每页巨细为 4K。一页巨细的内存块在内核中用 struct page 结构体来举行管理,struct page 中封装了每页内存块的状态信息,好比:组织结构,利用信息,统计信息,以及与其他结构的关联映射信息等。
而为了快速索引到具体的物理内存页,内核为每个物理页 struct page 结构体界说了一个索引编号:PFN(Page Frame Number)。PFN 与 struct page 是逐一对应的关系。
内核提供了两个宏来完成 PFN 与 物理页结构体 struct page 之间的相互转换。它们分别是 page_to_pfn 与 pfn_to_page。
内核中怎样组织管理这些物理内存页 struct page 的方式我们称之为做物理内存模子,差别的物理内存模子,应对的场景以及 page_to_pfn 与 pfn_to_page 的盘算逻辑都是不一样的。
2.1 FLATMEM 平展内存模子

我们先把物理内存想象成一片所在连续的存储空间,在这一大片所在连续的内存空间中,内核将这块内存空间分为一页一页的内存块 struct page 。
由于这块物理内存是连续的,物理所在也是连续的,分别出来的这一页一页的物理页肯定也是连续的,而且每页的巨细都是固定的,以是我们很容易想到用一个数组来组织这些连续的物理内存页 struct page 结构,其在数组中对应的下标即为 PFN 。这种内存模子就叫做平展内存模子 FLATMEM 。
内核中利用了一个 mem_map 的全局数组用来组织所有分别出来的物理内存页。mem_map 全局数组的下标就是相应物理页对应的 PFN 。
在平展内存模子下 ,page_to_pfn 与 pfn_to_page 的盘算逻辑就非常简单,本质就是基于 mem_map 数组举行偏移操纵。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-22 23:04, Processed in 0.148547 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表