Linux内存从0到1学习笔记(六,物理内存初始化之二 --- 内存模型)

Posted 高桐@BILL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内存从0到1学习笔记(六,物理内存初始化之二 --- 内存模型)相关的知识,希望对你有一定的参考价值。

写在前面

前面了解了内存节点,内存域及页帧page的初始化,以及spase内存模型的初始化。其中spase内存模型将物理内存划分成页,同时为每个页设置类型(可迁移,不可迁移 ,可回收等),方便后续进行碎片化管理,为了方便对页类型管理,内核将按照page block记录页类型,即将多个page 组成一个block(一般为pageblock_order管理管理,sparse模型是将页按照(1UL << (PFN_SECTION_SHIFT - pageblock_order)) 组织进行管理记录页类型。

术语:

Page 页

虚拟地址空间的页面通常被称为pages。大小通常与物理内存的page frame一致,通常为4K。

Page Frame 页框或页帧

物理内存的页面通常被称作Page Frames,我们可以把物理内存看作是一个个page size的内存区域排列起来的。而这样的每一个page size的内存区域我们称之为page frame。

PFN Page Frame Number 页框号

前面提到的Page Frame和PFN都是针对物理地址而言。给每个Page Frame指定一个编号,这个编号就是PFN。假设物理内存从0地址开始,PFN等于0的那个页框就是物理地址的0地址的那个page。假设物理地址从内存X开始,第一个页框号就是(x>>PAGE_SHIFT).

UMA Uniform memory access

系统中的所有的processor共享一个统一的,一致的物理内存空间,无论从哪一个processor发起访问,对内存地址的访问时间都是一样的。

Linux内存模型

前面也提到了,Linux内核支持3中内存模型,分别是flag memory model,discontiguous memory model和sparse memory model。为什么要了解内存模型,有了模型,才能对内存有更多维度的了解,通过模型来熟悉物理内存真实的分布情况。

Flat Memory Model 平坦内存模型

这对于cpu来说,物理内存空间是连续的,不存在空洞。种模型下,每一个物理页帧都会有一个page数据结构来抽象,因此系统中存在一个struct page的数组(mem_map),每一个数组条目指向一个实际的物理页帧(page frame)。PFN(page frame number)和mem_map数组index的关系是线性的。如下图:

Discontiguous Memory Model 非连续内存模型

这个主要是相对于Flat Memory Model来讲。非连续模型主要针对NUMA架构,这里不再赘述。

Sparse Memory Model 稀疏内存模型

该模型下,内存被按照SECTION分成一段段的,每一段的SECTION都是热插拔的,每个section内部内存都是连续的。mem_map的page数组依附于section结构,而不再是node结构。

kernel中静态定义了一个mem_section的指针数组,一个section中往往包括多个page,因此需要通过右移将PFN转换成section number,用section number做为index在mem_section指针数组可以找到该PFN对应的section数据结构。找到section之后,沿着其section_mem_map就可以找到对应的page数据结构。

以上是关于Linux内存从0到1学习笔记(六,物理内存初始化之二 --- 内存模型)的主要内容,如果未能解决你的问题,请参考以下文章

Linux内存从0到1学习笔记(六,物理内存初始化之三 --- 物理内存管理数据结构)

Linux内存从0到1学习笔记(六,物理内存初始化之二 --- 内存模型)

Linux内存从0到1学习笔记(6.4,物理内存初始化之预留内存)

Linux内存从0到1学习笔记(6.8,物理内存初始化之buddy伙伴系统)

Linux内存从0到1学习笔记(6.7,物理内存初始化之CMA初始化)

Linux内存从0到1学习笔记(6.10 物理内存初始化之vmalloc分配器)