3.1 概述

  内存管理涵盖了许多领域:

  • 内存中物理内存页的管理;
  • 分配大块内存的伙伴系统;
  • 分配小块内存的slab、slub、slob分配器;
  • 分配非连续内存块的vmalloc机制;
  • 进程的地址空间。

  Linux内核一般将虚拟地址空间划分为两部分:底部较大的部分用于用户进程,顶部则用于内核。虽然(在两个用户进程之间)上下文切换期间会改变下半部分,但是虚拟地址空间的内核部分中总是不变【这其实很好理解,内核是系统管理员,不能说因为每换一批游客,景区管理员都得跟着换一批?!】。在IA-32系统上,虚拟地址空间在用户进程和内核之间划分的典型比例是3:1【arm亦是如此,但是我们使用的mips是2:2的划分。为什么这么划分呢?不解。】。通过修改配置选项可以改变比例,但是只有对非常特殊的配置和应用程序,这种修改才会带来好处。

  可用的物理内存将映射到内核的地址空间中【为什么呢?因为物理内存是内核来管理的,用户空间申请内存必然要通过kernel的分配】。访问内存时,如果所用的虚拟地址空间地址与内核区域的起始地址之间的偏移量不超出物理内存的长度,那么该虚拟地址会自动关联到物理页帧【例如在IA-32系统上,内核的虚拟地址空间只有1GB,但是如果物理内存的大小小于1GB,那么直接线性映射就可以】。不管还有一个问题,如我们所知,在IA-32位系统,大部分人会装4G内存,那么内核如何用1G的虚拟地址空间来管理者4G内存呢?如果物理内存比可以映射到内核地址空间中的数量要多,那么必须借助高端内存(highmem)方法来管理“多余的内存”。在IA-32系统上,可以直接管理的物理内存数量不超过896MB。超过该值的内存只能通过高端内存寻址【为什么是896?!满足两个约束条件:1.直接映射的内存尽量多 2.剩余的虚拟地址空间足够管理多余的内存】。

  主:1. 内核使用高端内存之前,必须使用kmap和kunmap函数将其映射到内核虚拟地址空间中,对普通内存这是不必要的。因为普通内存和内核虚拟地址空间存在线性映射关系,但是高端内存必须在使用时临时建立映射。所以访问普通内存要比高端内存块。

    2. 对用户进程来说,是高端内存还是普通页完全没有任何差别。因为用户空间总是通过页表访问内存,绝不会直接访问。

  有两种不同的计算机,分别以不同的方法管理内存。

  (1)UMA计算机(一致内存访问,uniform memory access)将可用内存以连续的方式组织起来(可能有小缺口)。SMP系统中每个处理器访问各个内存区一样快。

  (2)NUMA计算机(非一致内存访问,non-uniform memory access)总是多处理器的计算机。系统的各个CPU都有本地内存,可支持特别快速的访问。各个处理器之间通过总线连接起来,以支持对其他CPU的本地内存访问,当然比访问本地内存慢些。

                UMA系统

              NUMA系统

  两种类型计算机的混合也是可能的,其中使用不连续的内存。即在UMA系统中,内存不是连续的,而有比较大的洞。此时使用NUMA体系结构的原理可以使内核的内存访问更简单。实际上内核会区分3中配置选项:FLATMEM、DISCONTIGMEM和SPARSEMEM。DISCONTIGMEM和SPARSEMEM实际作用相同,但从开发者的角度讲,对应代码的质量有所不同。SPARSMEM被认为更多是实验性的,不那么稳定,但有一些性能优化。我们认为DISCONTIGMEM相关代码更稳定一些,但不具备内存热拔插之类的新特性。

    FLATMEM是内核的默认配置,也是使用最多的内存组织类型。我们主要讨论FLATMEM。

  真正的NUMA会配置选项CONFIG_NUMA,相关内存管理的代码与上述两种变体有所不同。通过配置NUMA_EMU可以使用平坦内存模型的AMD64系统来感受NUMA系统的复杂性,实际上将内存划分为加的NUMA内存域。由于某种原因,NUMA计算机过于昂贵。

  我们集中讨论UMA系统,不考虑OCNFIG_NUMA。由于UMA系统可以在地址空间有比较大的洞是选择配置选项CONFIG_DISCONTIGMEM,这种情况下即使不采用NUMA技术但是系统也会有多个内存结点。所以NUMA相关的数据结构不可完全忽略。

  注意:在下文中,我们经常会用到术语分配阶(allocation order)。它表示内存区中页的数目以2为底的对数。阶0的分配由一个页面组成,阶1的分配包括2^1 = 2个页。

【深入理解Linux内核架构】第3章:内存管理的更多相关文章

  1. 《深入理解linux内核架构》第二章 进程管理和调度

    2.1进程优先级 进程优先级 硬实时进程 软实时进程 抢占式多任务处理 2.2进程生命周期 用户太切换到核心态的办法 系统调用 中断 抢占调度模型优先级普通进程<系统调用<中断 普通进程可 ...

  2. 十天学Linux内核之第三天---内存管理方式

    原文:十天学Linux内核之第三天---内存管理方式 昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今 ...

  3. 【深入理解Linux内核架构】3.3 页表

    页表:用于建立用户进程空间的虚拟地址空间和系统物理内存(内存.页帧)之间的关联. 向每个进程提供一致的虚拟地址空间. 将虚拟内存页映射到物理内存,因而支持共享内存的实现. 可以在不增加物理内存的情况下 ...

  4. 【深入理解Linux内核架构】3.2 (N)UMA模型中的内存组织

    内核对一致和非一致内存访问系统使用相同的数据结构.在UMA系统上,只使用一个NUMA结点来管理整个系统内存.而内存管理的其他部分则相信他们是在处理一个伪NUMA系统. 3.2.1 概述 内存划分为结点 ...

  5. Linux内核分析——第三章 进程管理

    第三章 进程管理 3.1 进程 1.进程就是处于执行期的程序:进程就是正在执行的程序代码的实时结果:进程是处于执行期的程序以及相关的资源的总称:进程包括代码段和其他资源. 线程:是在进程中活动的对象. ...

  6. 《Linux内核设计与实现》内存管理札记

    1.页 芯作为物理页存储器管理的基本单元,MMU(内存管理单元)中的页表,从虚拟内存的角度来看,页就是最小单位. 内核用struct page结构来标识系统中的每个物理页.它的定义例如以下: flag ...

  7. 【深入理解Linux内核架构】6.6 资源分配

    一段摘自<Linux设备驱动程序>的话: 每种外设都通过读写寄存器进行控制.大部分外设都有多个寄存器,不管是内存地址空间还是I/O地址空间,这些寄存器的访问地址都是连续的. 在硬件层,内存 ...

  8. [Wolfgang Mauerer] 深入linux 内核架构 第十三章 系统调用

    作为Linux开发爱好者,从事linux 开发有三年多时间.做过bsp移植,熟悉u-boot代码执行流程:看过几遍<linux 设备驱动程序开发>,分析过kernel启动流程,写过驱动,分 ...

  9. 《深入理解linux内核》第三章 进程

    进程的七种状态 在内核源码的 include/linux/sched.h文件中: task_struct的status可表示 #define TASK_RUNNING 0 #define TASK_I ...

随机推荐

  1. 调试备忘录-RS485 MODBUS RTU协议简述

    目录--点击可快速直达 目录 写在前面 先简单说下什么是MODBUS? 参考文章 写在前面 最近在做和物联网有关的小项目,有一个传感器通讯用到了RS485 MODBUS RTU协议,所以就写个随笔记录 ...

  2. 对比两张Excel表数据差异时,遇到数据雷响不一致

    表A中为文本(有绿色三角符号),表B为数字(没有三角符号),而自动对比时会检查数据类型,怎么办? 执行对比: 得到结果: 这时候要解决类型问题(即绿色三角形标志) 点击灰色区域全选 哪个黄色感叹号可以 ...

  3. install-newton部署安装--------计算节点部署安装

    #################################################################################################### ...

  4. Java中实现对集合中对象按中文首字母排序

    有一个person对象如下: public class Person { private String id;private String nam; } 一个list集合如下: List<Emp ...

  5. latex:矩阵环境

    矩阵的最大列数值是在MaxMatrixCols计数器中设定的,默认值是10.可使用计数器设置命令修改其值,例如需要用到15列:\setcounter{MaxMatrixCols}{15};当超宽矩阵排 ...

  6. 表单和 v-model

    思维导图 form 做表单一定要用 form+button组合 <template> <div id="app"> 登录 <form @submit. ...

  7. ACM集训第一次积分赛赛前复习+day4

    不知不觉4天过去了,我们迎来了我们第一次积分赛,赛前的四天我们学了以下知识点吧: day 1.排序 之前一直想用qsort,但是总是写不明白,STL的sort()可以说是很方便了. 先写一个最基础的数 ...

  8. 区块链入门到实战(26)之以太坊(Ethereum) – 挖矿

    以太坊(Ethereum)与其他公共区块链一样,使用工作量证明机制确保区块链网络正常运行. 矿工进行工作量证明计算,即挖矿,来选择区块,写入区块链,确认交易. 交易过程如下图所示: 从技术角度来看,以 ...

  9. SpringBoot中加载XML配置

    开篇 在SpringBoot中我们通常都是基于注解来开发的,实话说其实这个功能比较鸡肋,但是,SpringBoot中还是能做到的.所以用不用是一回事,会不会又是另外一回事. 涛锅锅在个人能力能掌握的范 ...

  10. 在Fragment 中拦截返回键

    代码如下: class XXXFrgmt : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ...