管理模型

右边是虚拟地址,左下角是虚拟地址到物理地址的转换。

在linux系统程序中都是用虚拟地址。虚拟地址空间是由硬件来决定的。例如32位的系统,虚拟地址空间是4G=2的32次方。0-3G是用户空间,3G-4G是内核空间。而内核空间又被分为了四个部分:直接映射区(896M),vmalloc区,永久映射区,固定映射区。

虚拟地址到物理地址的转换

上图的简述:首先在我们的cr3寄存器中,存放的是页目录的基地址,然后虚拟地址把他转换为物理地址。然后怎么去找到我们的存储单元呢?首先高10位和我们的cr3相加,就可以找到一个页目录项里的页表的基地址。页表的基地址,再加上中间的10位,就可以找到一个物理页的基地址。物理页的基地址再去加上最后12位的偏移,就可以找到这个物理页,就可以去找到这个物理存储单元了。大小通常是4K大小。

我们知道,对于4G的内存,从3G----3G+896M,称为低端内存,3G+896M----4G称为高端内存。

  1. 所谓直接映射区,顾名思义就是直接映射的关系。直接的关系体现在,物理内存地址和他的虚拟内存之间的大小是固定的:相差3G大小。例如,有一个虚拟地址为3G+128M,那么他的物理地址为128M。
  2. Vmalloc区,他可以访问高端和低端区域,没有直接的映射关系。
  3. 永久映射区,固定用来访问高端内存的。
  4. 固定映射区,这个区域的地址与我们的特殊的寄存器建立联系的。

    在linux系统中,为了避免内存的浪费,采用的是虚拟内存,所谓的虚拟内存就是当你在用户程序使用malloc函数去创建一个内存空间的时候,系统分配给你的是虚拟地址,当你真正要使用到这个物理地址的时候,会产生一个请页异常(缺页异常),此时系统才会给你分配真正的物理空间。在内核程序存在两种情况:第一是:当我们使用vmalloc函数申请内存空间的时候,也是跟用户程序一样的情况。第二是:当我们采用Kmalloc函数申请内存空间的时候,内存才会分配给你虚拟内存和物理内存映射好的内存空间。原理是:内核里有一个slab函数,他会从空闲的物理内存中,取一些物理内存放到他的池子里面。当我们使用Kmalloc的时候,就会从池中分配一些给你。

    这些知识现在知识了解,等学了驱动才去深入。

转载于:https://www.cnblogs.com/FORFISH/p/5188438.html

9、linux内存管理子系统相关推荐

  1. Linux内核分析(三)----初识linux内存管理子系统

    原文:Linux内核分析(三)----初识linux内存管理子系统 Linux内核分析(三) 昨天我们对内核模块进行了简单的分析,今天为了让我们今后的分析没有太多障碍,我们今天先简单的分析一下linu ...

  2. linux内存管理子系统采用基于内存区域,Linux 内存管理之highmem简介

    一.Linux内核地址空间 一般来说Linux 内核按照 3:1 的比率来划分虚拟内存(X86等):3 GB 的虚拟内存用于用户空间,1GB 的内存用于内核空间.当然有些体系结构如MIPS使用2:2 ...

  3. Linux内存管理子系统——mmap内存映射原理分析(dax文件系统的mmap)

    Linux mmap分析 内核版本:linux-5.16 1. 虚拟内存概要及相关内容简介 内存映射是学习过操作系统的大家都耳熟能详的词,理解起来也很简单.所谓"映射"就是为一种事 ...

  4. linux虚拟地址空间管理,Linux内存管理4---虚拟地址空间管理

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

  5. linux内核分为子系统,Linux内核内存管理子系统分析【转】

    还是那张熟悉的老图:Linux内核子系统简介(由七个部分组成) Linux内存管理模型: 1. 内存管子系统职能: 1>  管理虚拟地址与物理地址的映射 2>  管理物理内存的分配 2. ...

  6. CMA内存管理子系统

    转:http://www.wowotech.net/memory_management/cma.html 前言 本文是近期学习CMA模块的一个学习笔记,方便日后遗忘的时候,回来查询以便迅速恢复上下文. ...

  7. 万字整理,图解Linux内存管理所有知识点

    Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...

  8. linux内存管理_浅谈Linux内存管理

    1. 扫盲篇 1.1 操作系统存储层次 常见的计算机存储层次如下: 寄存器:CPU提供的,读写ns级别,容量字节级别. CPU缓存:CPU和CPU间的缓存,读写10ns级别,容量较大一些,百到千节. ...

  9. Linux内存管理:知识点总结(ARM64)

    https://mp.weixin.qq.com/s/7zFrBuJUK9JMQP4TmymGjA 目录 Linux内存管理之CPU访问内存的过程 虚拟地址转换为物理地址的本质 Linux内存初始化 ...

最新文章

  1. 彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM+LIO-SAM)
  2. 一文搞懂PointNet全家桶——强势的点云处理神经网络
  3. 奥比中光Gemini 3D双目结构光深度相机在Android平台上深度数据噪点非常多的问题
  4. GDCM:将文件封装在RawData中的测试程序
  5. 屏蔽预训练模型的权重。 只训练最后一层的全连接的权重。_权重/参数初始化...
  6. 液态金属和Liquidmetal公司
  7. SAP Spartacus Unit List树形数据的加载触发时机
  8. 2018蓝桥杯省赛---java---C---8(等腰三角形)
  9. C 实现一个跨平台的定时器 论述
  10. c语言sqlserver进行odbc编程,在VS下用C语言连接SQLServer2008
  11. pdol链接mysql_MySQL5.7.11免安装版的安装和配置:解决MYSQL服务无法启动问题
  12. 蒟蒻吃药计划-治疗系列 #round6 数据结构初步-指针|链表|结构体
  13. aboboo 上一句 快捷键_Aboboo——英语四六级神器
  14. android init重启service(进程)
  15. 2022五一杯数学建模
  16. 2022年使用的最佳Javascript库
  17. 搭建vue开发环境的步骤
  18. 磁共振成像技术发展简史丨科学史
  19. 关于软件设计文档编写
  20. Vue-跟着李南江学编程

热门文章

  1. 【STM32】I2C详解
  2. 【Linux】一步一步学Linux——dpkg-trigger命令(276)
  3. 【Linux】一步一步学Linux——enable命令(212)
  4. 【Linux】一步一步学Linux——unalias命令(206)
  5. 【Linux】一步一步学Linux——tree命令(23)
  6. cmd上写的java简单代码_用cmd编辑一个超级简单的小游戏,求代码
  7. code.php验证码,php 验证码 实例
  8. C++学习笔记-----在一个构造函数中调用另一个构造函数
  9. VC操作MySQL数据库
  10. 设置、刷新屏幕分辨率