1. 虚拟内存

对于操作系统的使用者而言,内存就像是一个一排排按照从0到n被编好数字的收纳柜,每个柜子可以存放8个bit,也就是一个字节,我们将需要存放的信息切成若干个字节,放到连续的柜子中。以后我们只需要知道所使用的第一个柜子的编号,以及所用的柜子的数目,就可以完整的取出我们所保存的数据。

知道地址就可以找到我们要的数据,然后从内存读到处理器就可以进行操作了,整个流程如下所示

但问题真的这么简单吗?当然不可能,假设以下情况

  • 情景1:假如我调用一个软件为进程A,在内存0x11111111处开始存了若干个字节的字符串,表示的是我学习资料的种子链接,还没来得及写回到硬盘中,这时我打开了另一个软件,设为进程B,不小心对内存0x11111111出的信息进行了修改,最后当内存中信息写回硬盘时,我发现我的的学习资料已经无了。

  • 情景2:我的电脑只有4G内存,其中2G运行着系统内核,如果一个应用程序占用1G内存,那么我一次只能使用2个程序,如果我想一边打开浏览器一边写代码一边听音乐就无法做到了。

为了更好的使用内存,人们引用了虚拟内存,虚拟内存的作用可以总结为3点:

  • 虚拟内存可以利用物理内存起到缓存的作用,提高进程访问磁盘的速度,虚拟内存=物理内存+磁盘;
  • 虚拟内存可以为进程提供独立的内存空间,让每个进程都感觉自己在独享物理内存,简化程序的链接、加载过程并通过动态库共享内存;
  • 虚拟内存保证了每个进程的地址空间与其他进程相隔离,保证了安全性;

实际上的过程是这样的:

处理器CPU发出的虚拟地址通过MMU的翻译生成PTEA(页表项地址),通过页表查找获取物理地址PA,通过物理地址再到高速缓存或者内存中获取数据;如果如果PTE的有效位是0,则表示该页已失效,系统会触发缺页中断,主存将从磁盘中读取新页,最终将数据返回。

2. MMU虚拟内存翻译

以Intel i7core内存系统在为例

现在来介绍一些名词

  • 物理内存(physical memory),主存RAM,实际能使用的物理空间。
  • 物理页(physical page),把物理内存按照页表的大小进行划分,一般大小为4k,aka.页框。
  • 物理地址(physical address,PA), 物理内存划分了根据物理页划分为很多块,通过物理地址进行定位。
  • 物理页号(physical page number,PPN) ,定位缓存中的数据字。
  • 物理页号偏移 (physical page offset, PPO),定位缓存中的数据块。
  • 物理地址 PA = PPN + PPO
  • 虚拟内存(virtual memory),每个程序独有,由多个虚拟页(VP, virtual page)组成。
  • 虚拟内存的地址编码称虚拟地址空间(virtual address space VAS),跟物理内存一样,但虚拟内存是每个进程独有的,其大小是根据操作系统的指令集位有关,如32位,64位,32位,每个进程就有4G,64位有个百亿的GB。
  • 虚拟页(virtual page,VP ),把虚拟内存按照页表的大小进行划分,虚拟页的数目=物理页的数目+磁盘中页的数目。
  • 虚拟地址(virtual address),通俗说是计算机进程加载地址的指令,进程给的虚拟地址通过MMU进行获取地址计算物理地址空间,然后获取物理地址对应的数据传送到CPU上。
  • 虚拟页号(virtual page number ,VPN) ,用于定位页表的PTE(页表项)。
  • 虚拟页号偏移(virtual page offset VPO) ,跟PPO值一样。
  • 虚拟地址 VA = VPN + VPO
  • 虚拟页号VPN = TLBT + TLBI
  • TLB索引(TLB index,TLBI),在TLB中作为组索引。
  • TLBT标记(TLB tag,TLBT),在TLB中作为行匹配。
  • 缓存标记(cache tag,CT),在高速缓存中作为行匹配。
  • 缓存索引(cache index,CI),在高速缓存中作为组索引。
  • 缓存偏移(cache offset,CO),在高速缓存中用作行内偏移来选择目的数据块。
  • 页表(page tables,PT),虚拟地址与物理地址的对应表集合,存放在主存中。
  • 页表条目(page table entry,PTE),虚拟地址与物理地址具体对应记录。页表是由多个页表条目PTE组成的数组,PTE 由一个有效位 和 n位地址字段组成,如果设置了有效位,那么地址字段就标识DRAM中相应的物理页的起始位置。

其地址翻译流程图如下所示:

按照从快到慢、从正常到异常的顺序分别介绍几种可能的通路

首先通过虚拟地址VA获取物理地址PA:

  1. 处理器产生一个48位的虚拟地址VA,由36位VPN和12位VPO组成

  2. VPN低4位作为快表索引(TLBI),高32位作为标记(TLBT),在TLB(快表,高速缓存)中进行查找

    (1)若TLB命中,则可获得PPN,PPN + PPO(PPO == VPO) = PA,即可的到物理地址,跳转至步骤4

    (2)若TLB未命中,跳转至步骤3

  3. 在多级页表中查询最终物理地址的PPN,每一级页表项PTE = PPN + Flages + 保留部分。控制寄存器CR3 用于保存第一级页表的物理地址,因此被称为PTBR,获取到一级页表的物理地址后,据VPN1做偏移量查找到对应的页表项,根据该页表项中的PPN到物理内存中获取下一级页表首地址,再根据VPN2查找到对于的页表项,获取更下一级页表的物理地址,直到第四级页表,通过VPN4获取第四级页表中的PTE,从而得到最终物理地址的PPN,PA = PPN + PPO(PPO == VPO) ,进而得到物理地址,多级页表结构如下:

然后通过物理地址PA获取数据:

  1. 根据PA = CT + CI + CO,在L1高速缓存中查找对应数据

    (1)若缓存命中,直接返回数据

    (2)若缓存不命中,则跳转至步骤5

  2. 根据PA从主存中获取物理页

    (1)该物理页有效,直接根据PPO偏移获取数据返回

    (2)该物理页无效,跳转至步骤6

  3. 当操作系统发现是一个缺页中断时,查找出来发生页面中断的虚拟页(进程地址空间中的页面)。这个虚拟页的信息通常会保存在一个硬件寄存器中,如果没有的话,操作系统必须检索程序计数器,取出这条指令,用软件分析该指令,通过分析找出发生页面中断的虚拟页面。

    (1)检查虚拟地址的有效性及安全保护位。如果发生保护错误,则杀死该进程。

    (2)操作系统查找一个空闲的物理页,如果没有空闲的物理页则需要通过页面置换算法找到一个需要换出的物理页。

    (3)如果找的物理页中的内容被修改了,则需要将修改的内容保存到磁盘上,此时会引起一个写磁盘调用,发生上下文切换(在等待磁盘写的过程中让其它进程运行)。(注:此时需要将物理页置为忙状态,以防物理页被其它进程抢占掉)

    (4)物理页干净后,操作系统根据虚拟地址对应磁盘上的位置,将保持在磁盘上的页面内容复制到“干净”的物理页中,此时会引起一个读磁盘调用,发生上下文切换。

    (5)当磁盘中的页面内容全部装入物理页后,向操作系统发送一个中断。操作系统更新内存中的页表项,将虚拟页面映射的物理页号PPN更新为写入的物理页,并将物理页标记为正常状态。

    (6)恢复缺页中断发生前的状态,将程序指令器重新指向引起缺页中断的指令。

    (7)调度引起页面中断的进程,操作系统返回汇编代码例程。

    (8)汇编代码例程恢复现场,将之前保存在通用寄存器中的信息恢复。

  4. 将虚拟地址重新映射到新的物理地址,获取物理页,根据PPO偏移获取并返回数据。

3. 虚拟内存实际分配

在32位的机器上,地址空间从0x00000000~ 0xFFFFFFFF,总大小为4GB。一般而言,低地址空间,从0x00000000~ 0x7FFFFFFF使用户空间,高地址空间被分配给系统。

内存管理
每个进程都拥有自己的4G(32位机)虚拟内存地址,各个进程之间是相互独立的,每个进程的数据可由其中线程共享。虚拟内存地址本身不对应任何物理地址,直接引用会引发错误,虚拟内存地址必须映射物理地址后才能储存数据。内存分配其实指的是虚拟内存地址映射物理内存,内存回收就是指解除映射关系。

一个进程的内存分配

一个进程的虚拟内存如下所示:

本文参考 :

《深入理解计算机系统》

缺页中断处理过程

Linux虚拟内存与线性地址翻译相关推荐

  1. Linux下逻辑地址-线性地址-物理地址图解

    一.逻辑地址转线性地址 机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到. 我们写个最简单的hello world程序 ...

  2. 4KB/2MB/1GB 4级/5级分页模式下的线性地址翻译以及CR3

    摘自<Intel® 64 and IA-32 Architectures Software Developer's Manual Combined Volumes1, 2A, 2B, 2C, 2 ...

  3. 4KB/2MB PAE分页模式下的线性地址翻译以及CR3

    摘自<Intel® 64 and IA-32 Architectures Software Developer's Manual Combined Volumes1, 2A, 2B, 2C, 2 ...

  4. 4KB/4MB 32位分页模式下的线性地址翻译以及CR3

    摘自<Intel® 64 and IA-32 Architectures Software Developer's Manual Combined Volumes1, 2A, 2B, 2C, 2 ...

  5. linux kernel基本构成的内容有下列哪些项_Linux下逻辑地址-线性地址-物理地址详解...

    一.逻辑地址转线性地址 机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到. 我们写个最简单的hello world程序 ...

  6. linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别(一)

    分析linux内存管理机制,离不了上述几个概念,在介绍上述几个概念之前,先从<深入理解linux内核>这本书中摘抄几段关于上述名词的解释: 一.<深入理解linux内核>的解释 ...

  7. linux的物理内存与线性地址空间布局

    在支持MMU的32位处理器平台上,Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同.Lin ...

  8. linux内核线性地址等于物理地址,Linux 从虚拟地址到物理地址

    我们都知道,动态共享库里面的函数的共享的,这也是动态库的优势所在,就是节省内存.C 编译出来的可执行文件几乎都会用到libc的库,假如没有这个共享的技术,每个可执行文件都要占一份libc库的内存,这将 ...

  9. 计算机系统-理论-内存分页机制/线性地址/虚拟内存

    假设内存中运行三个程序,分别是程序A,B,和C,三个程序将内存瓜分如下图 上图表示内存一共有6个字节,A程序用了12两个字节,B用了34两个字节,C用了56两个字节,现在如果A和C两个程序运行完毕,那 ...

最新文章

  1. Machine Learning(Stanford)| 斯坦福大学机(吴恩达)器学习笔记【汇总】
  2. java 引用机制_Java编程开发之浅析Java引用机制
  3. 【OpenCV】 车牌识别检测
  4. Java开发实用的面试题及参考答案
  5. matlab freqz2 逆变化,【matlab】freqz函数的使用(二)
  6. 曲线运动与万有引力公式_专题三曲线运动与万有引力定律
  7. 图论--哈密顿路与欧拉路
  8. 什么是归纳法、数学归纳法
  9. 51单片机农历转换公历c语言算法,51单片机阳历转农历(仅仅是阳历转阴历例程)...
  10. job每分钟执行 oracle_oracle的job怎么设置一个过程每5分钟执行一次
  11. python 条形图显示数值_如何在条形图的条形图中显示数值?
  12. 红外数据集 | 收集OTCBVS、KAIST、FLIR红外图像数据
  13. 物联网外设学习笔记-摄像头(一)
  14. HDMI切换器的各种版本能不能互通?
  15. 关于微信防撤回(文本、图片、语音、视频、名片等...)的Python学习教程
  16. 【学习笔记】Python基础入门知识笔记,万字攻略带你走进Python编程
  17. 框架的概念框架(Framework)
  18. verilog设计简易正弦波信号发生器_FPGA学习(一)——产生频率可控的正弦波
  19. 滴水藏海 ----《你需要一个系统 第十章》
  20. 认识C标准函数库全集-2-测试及定义类文件-assert/errno/ctype/float/limits/locale/stddef

热门文章

  1. 使用@Transactional应注意的问题
  2. getBoundingClientRect()方法
  3. EXTJS 重新加载树结点
  4. 超级列表框排序mysql_超级列表框List Ctrl
  5. cad2020 开始_如何设置CAD2020经典模式,原来这么简单,一起来看看
  6. Win64 驱动内核编程-15.回调监控注册表
  7. 【数字信号处理】相关函数应用 ( 相关函数应用场景 | 噪声中检测信号原理 )
  8. 【Binder 机制】Native 层 Binder 机制分析 ( service_manager.c | 开启 Binder | 注册 Binder 进程上下文 | 开启 Binder 循环 )
  9. 【错误记录】Flutter 界面报错 ( No MediaQuery widget ancestor found. | Scaffold widgets require a MediaQuery )
  10. 【RecyclerView】 九、为 RecyclerView 设置不同的布局样式