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---物理内存管理的更多相关文章

  1. Linux内存:物理内存管理概述

    内存中的物理内存管理 概述 一般来说,linux内核一般将处理器的虚拟地址空间划分为2部分.底部比较大的部分用于用户进程,顶部则专用于内核. 在IA-32系统上,地址空间在用户进程和内核之间划分的典型 ...

  2. Linux内存管理6---伙伴算法与slab

    1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本 ...

  3. Linux内存管理 (1)物理内存初始化

    专题:Linux内存管理专题 关键词:用户内核空间划分.Node/Zone/Page.memblock.PGD/PUD/PMD/PTE.lowmem/highmem.ZONE_DMA/ZONE_NOR ...

  4. Linux内存管理--物理内存分配【转】

    转自:http://blog.csdn.net/myarrow/article/details/8682819 1. First Fit分配器 First Fit分配器是最基本的内存分配器,它使用bi ...

  5. 浅谈Linux内存管理机制

    经常遇到一些刚接触Linux的新手会问内存占用怎么那么多?在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这 ...

  6. linux内存管理

    一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分:    1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程 ...

  7. MySQL 调优基础(二) Linux内存管理

    进程的运行,必须使用内存.下图是Linux中进程中的内存的分布图: 其中最重要的 heap segment 和 stack segment.其它内存段基本是大小固定的.注意stack是向低地址增长的, ...

  8. Linux内存管理原理

    本文以32位机器为准,串讲一些内存管理的知识点. 1. 虚拟地址.物理地址.逻辑地址.线性地址 虚拟地址又叫线性地址.linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻 ...

  9. Linux内存管理基本概念

    1. 基本概念 1.1 地址 (1)逻辑地址:指由程序产生的与段相关的偏移地址部分.在C语言指针中,读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址.( ...

  10. 了解linux内存管理机制(转)

    今天了解了下linux内存管理机制,在这里记录下,原文在这里http://ixdba.blog.51cto.com/2895551/541355 根据自己的理解画了张图: 下面是转载的内容: 一 物理 ...

随机推荐

  1. 自学Aruba4.2-Aruba AC基础配置(1)

    点击返回:自学Aruba之路 自学Aruba4.2-Aruba AC基础配置(1) 管理员登陆(admin/saic_admin): Cli Web 管理帐号 控制器基础设置: 控制器恢复出厂设置 查 ...

  2. [luogu3178][bzoj4034][HAOI2015]树上操作

    题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...

  3. 洛谷 P2680 运输计划 解题报告

    P2680 运输计划 题目背景 公元2044年,人类进入了宇宙纪元. 题目描述 公元2044年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道,每条航道建立在两个星 ...

  4. codeforces 793B - Igor and his way to work(dfs、bfs)

    题目链接:http://codeforces.com/problemset/problem/793/B 题目大意:告诉你起点和终点,要求你在只能转弯两次的情况下能不能到达终点.能就输出“YES”,不能 ...

  5. 利用快排partition求前N小的元素

    求前k小的数,一般人的想法就是先排序,然后再遍历,但是题目只是求前N小,没有必要完全排序,所以可以想到部分排序,而能够部分排序的排序算法我能想到的就是堆排序和快排了. 第一种思路,局部堆排序. 首先, ...

  6. [FJOI2017]矩阵填数——容斥

    参考:题解 P3813 [[FJOI2017]矩阵填数] 题目大意: 给定一个 h∗w 的矩阵,矩阵的行编号从上到下依次为 1...h ,列编号从左到右依次 1...w . 在这个矩阵中你需要在每个格 ...

  7. 【模板】第 K 大数

    题目:给定一个序列,求其第 K 大的数是多少. 时间复杂度\(O(n)\) 代码如下: #include <bits/stdc++.h> using namespace std; cons ...

  8. javascript面向对象精要第一章原始类型和引用类型整理精要

  9. Pentaho data integration(kettle) 在Mac上启动不了

    环境 MacOS Mojave (10.14.1) Pentaho Data Integration 8.2 Java 8 现象 从官方下载下来最新的安装包,解压之后,双击Data Integrati ...

  10. 多线程之间的通信(等待唤醒机制、Lock 及其它线程的方法)

    一.多线程之间的通信. 就是多个线程在操作同一份数据, 但是操作的方法不同. 如: 对于同一个存储块,其中有两个存储位:name   sex, 现有两个线程,一个向其中存放数据,一个打印其中的数据. ...