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. FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)

    前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...

  2. android 让真机显示 DeBug Log调试信息

    真机默认是不开启Log 开关的,这么来说我们如果使用真机来搞程序测试的话,需要做以下几个步骤: 下面以华为手机为例开启手机的log功能:  1.在拨号界面输入:*#*#2846579#*#*  进入测 ...

  3. BZOJ 193题纪念

  4. 洛谷 P2420 让我们异或吧 解题报告

    P2420 让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中-xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B ...

  5. hql和sql练习题

    SQL与HQL练习题 中的所有员工. select * from emp where deptno = 30 from  Emp  e  where e.deptno = 30 2. 列出所有办事员( ...

  6. B2C商城关键技术点总结(站内搜索、定时任务)

    1.站内搜索 1.1Lucene.Net建立信息索引 string indexPath = @"E:\xxx\xxx";//索引保存路径 FSDirectory directory ...

  7. javascript:location.reload()和location.replace()的区别,及对图片缓存的影响。

    有段时间没有清理IE的临时文件(缓存文件),在我清理的时候,我突然发现一个问题. 我打开的一个网站,图片默认缓存一个月的,但我发现,当我上传图片或删除图片之后,图片重新缓存,也就意味着,在我上传新图片 ...

  8. CodeForces - 893D 贪心

    http://codeforces.com/problemset/problem/893/D 题意 Recenlty Luba有一张信用卡可用,一开始金额为0,每天早上可以去充任意数量的钱.到了晚上, ...

  9. GO语言的进阶之路-面向过程式编程

    GO语言的进阶之路-面向过程式编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们在用Golang写一个小程序的时候,未免会在多个地方调用同一块代码,这个时候如何优化你的代码呢 ...

  10. Hbase记录-Hbase Web管理工具

    1.Hmaster的Web接口-端口参数:hbase.master.info.port  默认为16010 http://hbase_master_server:16010 可查看hbase的版本信息 ...