Linux内存管理图文讲解

逻辑地址、线性地址、物理地址和虚拟地址

一、概念

物理地址(physical address)

用于内存芯片级的单元寻址,和处理器和 CPU 连接的地址总线相对应。

这个概念应该是这几个概念中最佳理解的一个,不过值得一提的是,虽然能直接把物理地址理解成插

在机器上那根内存本身,把内存看成一个从 0 字节一直到最大空量逐字节的编号的大数组,然后把这个数

组叫做物理地址,不过事实上,这只是个硬件提供给软件的抽像,内存的寻址方式并不是这样。所以,说

他是“和地址总线相对应”,是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理地址和物

理的内存一一对应,也是能接受的。也许错误的理解更利于形而上的抽像。

虚拟内存(virtual memory)

这是对整个内存(不要和机器上插那条对上号)的抽像描述。他是相对于物理内存来讲的,能直接理

解成“不直实的”,“假的”内存,例如,一个 0 内存地址,他并不对就物理地址上那个大数

组中 0- 1 那个地址元素;

之所以是这样,是因为现代操作系统都提供了一种内存管理的抽像,即虚拟内存(virtual memory )。进程

使用虚拟内存中的地址,由操作系统协助相关硬件,把他“转换”成真正的物理地址。这个“转换”,是

所有问题讨论的关键。有了这样的抽像,一个程式,就能使用比真实物理地址大得多的地址空间。(拆东

墙,补西墙,银行也是这样子做的),甚至多个进程能使用相同的地址。不奇怪,因为转换后的物理地址

并非相同的。

能把连接后的程式反编译看一下,发现连接器已为程式分配了一个地址,例如,要调用某个函数 A ,

代码不是 call A,而是 call 0x0811111111 ,也就是说,函数A 的地址已被定下来了。没有这样的“转换”,

没有虚拟地址的概念,这样做是根本行不通的。

打住了,这个问题再说下去,就收不住了。

逻辑地址(logical address)

Intel 为了兼容,将远古时代的段式内存管理方式保留了下来。逻辑地址指的是机器语言指令中,用来指定

一个操作数或是一条指令的地址。以上例,我们说的连接器为 A 分配的 0这个地址就是逻辑地

址。

不过不好意思,这样说,似乎又违背了 Intel 中段式管理中,对逻辑地址需求,“一个逻辑地址,是由

一个段标识符加上一个指定段内相对地址的偏移量,表示为 [段标识符:段内偏移量] ,也就是说,上例中

那个 0应该表示为[A 的代码段标识符: 0,这样,才完整一些”

线性地址(linear address)或也叫虚拟地址(virtual address)

跟逻辑地址类似,他也是个不真实的地址,如果逻辑地址是对应的硬件平台段式管理转换前地址的话,那

么线性地址则对应了硬件页式内存的转换前地址。

CPU 将一个虚拟内存空间中的地址转换为物理地址,需要进行两步:首先将给定一个逻辑地址(其实是段

内偏移量,这个一定要理解!!!),CPU 要利用其段式内存管理单元,先将为个逻辑地址转换成一个线

程地址,再利用其页式内存管理单元,转换为最终物理地址。

这样做两次转换,的确是非常麻烦而且没有必要的,因为直接能把线性地址抽像给进程。之所以这样冗余,

Intel 完全是为了兼容而已。

2、CPU 段式内存管理,逻辑地址怎么转换为线性地址

一个逻辑地址由两部份组成,段标识符: 段内偏移量。段标识符是由一个 16 位长的字段组成,称为段选择

符。其中前 13 位是个索引号。后面 3 位包含一些硬件细节,如图:

最后两位涉及权限检查,本贴中不包含。

索引号,或直接理解成数组下标。那他总要对应一个数组吧,他又是什么东东的索引呢?这个东东就是“段

描述符(segment descriptor)”,呵呵,段描述符具体地址描述了一个段(对于“段”这个字眼的理解,我

是把他想像成,拿了一把刀,把虚拟内存,砍成若干的截段)。这样,非常多个段描述符,就组了一个数

组,叫“段描述符表”,这样,能通过段标识符的前 13 位,直接在段描述符表中找到一个具体的段描述符,

这个描述符就描述了一个段,我刚才对段的抽像不太准确,因为看看描述符里面究竟有什么东东也就是他

究竟是怎么描述的,就理解段究竟有什么东东了,每一个段描述符由 8 个字节组成,如下图:

这些东东非常复杂,虽然能利用一个数据结构来定义他,不过,我这里只关心相同,就是 Base 字段,他

描述了一个段的开始位置的线性地址。

Intel 设计的本意是,一些全局的段描述符

linux内存管理详解,Linux内存管理图文讲解.pdf相关推荐

  1. Linux文件关联详解 linux 修改默认文件关联打开程序

    linux 修改默认文件关联打开程序 从总体上讲 /etc/gnome/defaults.list 保存了全局的打开方式 /.local/share/applications/mimeapps.lis ...

  2. 清理linux服务器缓存,详解Linux手动释放缓存的方法

    详解Linux手动释放缓存的方法 发布时间:2020-08-20 07:53:27 来源:脚本之家 阅读:87 作者:闪电王国 栏目:服务器 Linux释放内存的命令: sync echo 1 > ...

  3. tomcat java内存_[Tomcat]Java内存溢出详解Tomcat内存设置

    Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1.java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在启 ...

  4. linux命令 正则表达式,详解Linux命令中的正则表达式

    详解Linux命令中的正则表达式 Mark Do 2017年9月19日 暂无评论 阅读 981 次 命令中的正则表达式 如果要在命令输出或文本中筛选内容时使用模糊查找,就需要使用正则表达式.正则表达式 ...

  5. linux who命令详解,Linux who命令详解

    Linux who命令详解教程 Linux who命令详解 功能 显示系统中哪些使用者. 语法 who [options] 参数 参数 描述 options who 命令使用的参数. who命令常用参 ...

  6. linux sed.写文件,Linux文件处理sed命令-linux sed命令详解-linux sed写入文件-嗨客网

    Linux文件处理sed命令详解教程 Linux sed命令使用 Linux sed 命令处理时,把当前处理的行存储在临时缓冲区中,称为 "模式空间"( oattern space ...

  7. linux摄像头V4L2 subdev,linux 摄像头驱动 详解linux 摄像头驱动编写

    想了解详解linux 摄像头驱动编写的相关内容吗,feixiaoxing在本文为您仔细讲解linux 摄像头驱动的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:linux,摄像头驱动,下面 ...

  8. linux的退出tail命令,Linux显示文件最后几行-Linux tail命令详解-Linux tail命令退出-嗨客网...

    Linux显示文件最后几行(tail) Linux显示文件最后几行(tail)教程 Linux tail命令详解 功能 查看文件的最后几行. 语法 tail [options] file.. 参数 参 ...

  9. C/C++内存管理详解以及内存泄露的检测

    文章目录 前言 一.C/C++内存分布? 1.内存布局示意图: 2.内存存放的数据类型 二.C/C++内存管理 1.C内存管理 2.C++内存管理 三.内存泄漏 1.概念 2.Windows平台下检测 ...

最新文章

  1. 又一次 Java 内存泄漏排查,新技能+1
  2. jQueryDOM操作
  3. kafka_2.11-0.10.2.1中的auto.offset.reset
  4. 玩转VSCode插件之Remote-SSH
  5. 树莓派悄悄放了个微软“后门”,系统加入微软源却未告知,用户怒了
  6. 利用pip3安装包只能在python2中调用
  7. vs2013新建web项目异常 0x80070002 处理
  8. superagent返回结果乱码
  9. 设置IIS会话过期时间
  10. MySQL的chap服务器_chap01 初涉MySQL
  11. 74系列标准逻辑集成芯片分类
  12. Unity的UGUI用TexturePacker全自动打图集,包括九宫格切图信息
  13. C++ 类(静态成员和静态函数)
  14. goto加密php,PHP文件解密求大神思路,PHP加密后有大量goto语句
  15. myisam和innodb区别
  16. 夯实基础之C语言基础算法
  17. 【关于微阵列芯片和RNA-seq的比较】
  18. GB/T28181-2016 SDP定义和音视频传输模式解读
  19. Python中定义函数的关键字是什么?一起来学习下吧
  20. 自然辩证法复习题 1

热门文章

  1. Bzoj 3226: [Sdoi2008]校门外的区间
  2. 【英语学习】【WOTD】katzenjammer 释义/词源/示例
  3. shell脚本的一些用法笔记
  4. 矩形法_教程 | 三个案例教会你大师都爱用的矩形造字法!
  5. java list 改变变量的值_3、list改变指针还是改变值
  6. java map isempty_Java HashMap isEmpty() 使用方法及示例
  7. html+css个人博客_如何在互联网放置 HTML 页面
  8. JNI 简明教程之手把手教你入门
  9. $.getJSON()应用
  10. sqlite C/C++