Linux内存管理5---物理内存管理
1.前言
本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理。
本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础、虚拟地址空间的管理、物理地址空间的管理.
本文将主要以X86架构为例来介绍物理地址空间的管理。
请页机制可以为进程请求物理内存,如下将讲述物理内存在内核中如何管理和分配的
2.内核虚拟空间的划分

图 内核空间的划分图示
- 在IA-32体系结构上,内核空间的地址范围是PAGE_OFFSET~4G
- 内核空间的第一部分试图将物理内存的全部空间线性映射到虚拟地址空间中,最多只能映射high_memory(默认大小为896M)的物理内存,即将0~896M的物理内存直接映射
- 大于high_memory的物理内存将通过页表进行映射到内核空间的后半部分
- 0~high_memory称为低端内存,大于high_memory称为高端内存
3.内核虚拟地址和物理地址的转换
- __pa(vaddr)
返回vaddr虚拟地址所对应的物理地址,源码实现为:

- __va(paddr)
返回paddr物理地址所对应的虚拟地址,源码实现为:

注:如上两个函数仅限于内核空间低端物理内存(也就是内核空间线性映射部分)的地址转换
4. UMA和非UMA
- NUMA计算机(non-uniform memeory access)
总是多处理计算机,每个CPU拥有各自的本地内存,这样每个CPU都能以较快的速度访问本地的内存,各个CPU通过总线链接起来,也可以访问其它CPU的内存,不过速度会慢些

- UMA计算机(uniform memory access)
常见的计算机访问内存方式,无论多处理器还是单处理器都只能访问一整块内存

5. 物理内存的组织
为了兼容NUMA模型,内核引入了内存节点,每个节点关联一个CPU.各个节点又划分为几个内存区,每个内存区又包含若干个页框
物理内存在逻辑上被划分为三级结构,分别使用pg_data_t,zone和page这三种数据结构分别描述节点、区、物理页框

图 物理内存三级结构图示
- 内存节点(pg_data_t)
NUMA计算机中每个CPU的物理内存称为一个内存节点,通过pg_data_t数据结构描述,系统内所有节点形成一个双链表
UMA模型下的物理内存只对应一个内存节点,整个物理内存形成一个节点,因此上述节点链表只有一个元素
- 内存管理区(zone)
各个内存节点划分为若干个区,也是对物理内存的进一步划分。物理内存通过下面几个宏来标记不同的区:
ZONE_DMA:标记适合DMA范围的物理内存区
ZONE_NORMAL:可以直接线性映射到内核空间的物理内存区(0~896M的物理内存区)
ZONE_HIGHMEM:超出内核空间大小的物理内存区(即高于896M的物理内存区)
- 页框(page)
内核使用page结构体来描述一个物理页框,该结构也称为页描述符。
页框代表物理内存的最小单位,每个物理页框都关联这样一个结构体,所有的页描述符都存放在mem_map数组中
6. 物理内存管理机制
- 伙伴算法
负责大块连续物理内存的分配和释放,以页框为基本单位,可以避免外部碎片,可以分配20~210大小的物理内存块
- slab缓存
负责小块物理内存的分配,它也作为一个缓存,主要针对内核中经常分配并释放的对象
- per-cpu页框缓存
内核经常请求和释放单个页框,该缓存包含预先分配的页框,用于满足本地CPU发出的单一页框请求
Linux内存管理5---物理内存管理的更多相关文章
- Linux内存:物理内存管理概述
内存中的物理内存管理 概述 一般来说,linux内核一般将处理器的虚拟地址空间划分为2部分.底部比较大的部分用于用户进程,顶部则专用于内核. 在IA-32系统上,地址空间在用户进程和内核之间划分的典型 ...
- Linux内存管理6---伙伴算法与slab
1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本 ...
- Linux内存管理 (1)物理内存初始化
专题:Linux内存管理专题 关键词:用户内核空间划分.Node/Zone/Page.memblock.PGD/PUD/PMD/PTE.lowmem/highmem.ZONE_DMA/ZONE_NOR ...
- Linux内存管理--物理内存分配【转】
转自:http://blog.csdn.net/myarrow/article/details/8682819 1. First Fit分配器 First Fit分配器是最基本的内存分配器,它使用bi ...
- 浅谈Linux内存管理机制
经常遇到一些刚接触Linux的新手会问内存占用怎么那么多?在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这 ...
- linux内存管理
一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分: 1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程 ...
- MySQL 调优基础(二) Linux内存管理
进程的运行,必须使用内存.下图是Linux中进程中的内存的分布图: 其中最重要的 heap segment 和 stack segment.其它内存段基本是大小固定的.注意stack是向低地址增长的, ...
- Linux内存管理原理
本文以32位机器为准,串讲一些内存管理的知识点. 1. 虚拟地址.物理地址.逻辑地址.线性地址 虚拟地址又叫线性地址.linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻 ...
- Linux内存管理基本概念
1. 基本概念 1.1 地址 (1)逻辑地址:指由程序产生的与段相关的偏移地址部分.在C语言指针中,读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址.( ...
- 了解linux内存管理机制(转)
今天了解了下linux内存管理机制,在这里记录下,原文在这里http://ixdba.blog.51cto.com/2895551/541355 根据自己的理解画了张图: 下面是转载的内容: 一 物理 ...
随机推荐
- CDQ分治总结(CDQ,树状数组,归并排序)
闲话 CDQ是什么? 是一个巨佬,和莫队.HJT(不是我这个蒟蒻)一样,都发明出了在OI中越来越流行的算法/数据结构. CDQ分治思想 分治就是分治,"分而治之"的思想. 那为什么 ...
- [luogu1131][bzoj1060][ZJOI2007]时态同步【树形DP】
传送门:https://www.luogu.org/problemnew/show/P1131 题目大意 给你一棵树,每条边有边权,要求增加一些边的边权,使得根节点到每个叶子节点的距离相等,求出最少共 ...
- USACO 好题汇总
背景 这里主要是用来针对USACO上的题目的二次汇总,因为我在刷题的过程中,有的题目我是可以很快想到解决方案的,对于这种题目,就没有必要深究了.但是有一些题目对于我来说还是有一些挑战的,可能用朴素的算 ...
- 洛谷 P1337 [JSOI2004]平衡点 / 吊打XXX 解题报告
P1337 [JSOI2004]平衡点 / 吊打XXX 题目描述 有 \(n\) 个重物,每个重物系在一条足够长的绳子上.每条绳子自上而下穿过桌面上的洞,然后系在一起.\(X\)处就是公共的绳结.假设 ...
- 「THUSCH 2017」大魔法师 解题报告
「THUSCH 2017」大魔法师 狗体面太长,帖链接了 思路,维护一个\(1\times 4\)的答案向量表示\(A,B,C,len\),最后一个表示线段树上区间长度,然后每次的操作都有一个转移矩阵 ...
- 洛谷 P2467 地精部落 解题报告
P2467 [SDOI2010]地精部落 题目描述 传说很久以前,大地上居住着一种神秘的生物:地精. 地精喜欢住在连绵不绝的山脉中.具体地说,一座长度为\(N\)的山脉\(H\)可分为从左到右的\(N ...
- (转)Java中equals和==、hashcode的区别
背景:学习辉哥总结的基础知识,从头来,直面短板. 1 问题引入及分析 请看下面的代码清单1 @Test public void test01() { String a = "a" ...
- 初探ant-design(web版本二)
Dropdown下拉菜单 向下弹出的列表. 何时使用# 当页面上的操作命令过多时,用此组件可以收纳操作元素.点击或移入触点,会出现一个下拉菜单.可在列表中进行选择,并执行相应的命令. 最简单的下拉菜单 ...
- python influxdb
Git:https://github.com/influxdata/influxdb-python 帮助文档:http://influxdb-python.readthedocs.io/en/late ...
- 数据结构(六)查找---平衡二叉树(ASL)
前提 我们之前的二叉排序树的插入(构建)是按照我们输入的数据来进行的,若是我们的数据分布不同,那么就会构造不同的二叉树 { , , , , , , , , , } { , , , , , , , , ...