linux内存管理2:内存映射和需求分页(英文名字:demand Paging,又叫:缺页中断)【转】
转自:http://blog.csdn.net/zhangxinrun/article/details/5873148
当某个程序映象开始运行时,可执行映象必须装入进程的虚拟地址空间。如果该程序用到了任何一个共享库,则共享库也必须装入进程的虚拟地址空间。实际上,Linux 并不将映象装入物理内存,相反,可执行文件只是被链接到进程的虚拟地址空间中(磁盘空间中)。随着程序的运行,被引用的程序部分会由操作系统装入物理内存。这种将映象链接到进程地址空间的方法称为“内存映射”。可执行映像.
每个进程的虚拟内存由一个 mm_struct 结构代表,我们将在下一章中详细讲述该结构。该结构中实际包含了当前执行映象的有关信息,并且包含了一组指向 vm_area_struct 结构的指针。如图 10-5 所示,每个 vm_area_struct 描述了一个虚拟内存区域的起点和终点、进程对内存的访问权限以及一个对内存的操作例程集。操作例程集是 Linux 操作该内存区域时所使用的例程集合。例如,当进程试图访问的虚拟内存当前不在物理内存当中时(通过页故障),Linux 就可以利用操作集中的一个例程执行正确的操作,在这种情况下为 nopage 操作。
图 10-5 vm_area_struct 数据结构示意图
当可执行映象映射到进程的虚拟地址空间时,将产生一组 vm_area_struct 结构来描述虚拟内存区域的起始点和终止点,每个 vm_struct 结构代表可执行映象的一部分,可能是可执行代码,也可能是初始化的变量或未初始化的数据。随着 vm_area_struct 结构的生成,这些结构所描述的虚拟内存区域上的标准操作函数也由 Linux 初始化。
某个可执行映象映射到进程虚拟内存中并开始执行时,因为只有很少一部分装入了物理内存,因此很快就会访问尚未装入物理内存的虚拟内存区域。这时,处理器将向 Linux 报告一个页故障及其对应的故障原因。
这种页故障的出现原因有两种,一是程序出现错误,例如向随机物理内存中写入数据,这种情况下,虚拟内存是无效的,Linux 将向程序发送 SIGSEGV 信号并终止程序的运行;另一种情况是,虚拟地址有效,但其所对应的页当前不在物理内存中,这时,操作系统必须从磁盘映象或交换文件中将内存装入物理内存。
那么,Linux 如何判断页故障发生时,虚拟内存地址是否是有效的呢?如前所述,Linux 利用 vm_area_struct 数据结构描述进程的虚拟内存空间,为了查找出现页故障虚拟内存相应的 vm_area_struct 结构的位置,Linux 内核同时维护一个由 vm_area_struct 结构形成的 AVL(Adelson-Velskii and Landis)树。利用 AVL 树,可快速寻找发生页故障的虚拟地址所在的内存页区域。如果搜索不到这一内存区域,则说明该虚拟地址是无效的,否则该虚拟地址是有效的。
也有可能因为进程在虚拟地址上进行的操作非法而产生页故障,例如在只读页中写入数据。这时操作系统会同样发送内存错误信号到该进程。有关页的访问控制信息(只读页、只写页、可读可写页、可执行代码页等)包含在页表项中。
对有效的虚拟地址,Linux 必须区分页所在的位置,即判断页是在交换文件中,还是在可执行映象中。为此,Linux 通过页表项中的信息区分页所在的位置。如果该页的页表项是无效的,但非空,则说明该页处于交换文件中,操作系统要从交换文件装入页(有关内存交换的内容在下一节中讲述)。否则,默认情况下,Linux 会分配一个新的物理页并建立一个有效的页表项;对于映象的内存映射来讲,则会分配新的物理页,更新页表项属性信息,并从映象中装入页。
这时,所需的页装入了物理内存,页表项也同时被更新,然后进程就可以继续执行了。这种只在必要时才将虚拟页装入物理内存的处理称为“需求分页”。
在处理页故障的过程中,因为要涉及到磁盘访问等耗时操作,因此操作系统会选择另外一个进程进入执行状态。
linux内存管理2:内存映射和需求分页(英文名字:demand Paging,又叫:缺页中断)【转】的更多相关文章
- Linux进程管理——查看内存的工具
Linux进程管理——查看内存的工具 一查看内存的工具vmstat vmstat命令:虚拟内存信息vmstat [options] [delay [count]]vmstat 2 5 [root@ce ...
- SAP专家培训之Netweaver ABAP内存管理和内存调优最佳实践
培训者:SAP成都研究院开发人员Jerry Wang 1. Understanding Memory Objects in ABAP Note1: DATA itab WITH HEADER LINE ...
- Linux内存管理 (12)反向映射RMAP
专题:Linux内存管理专题 关键词:RMAP.VMA.AV.AVC. 所谓反向映射是相对于从虚拟地址到物理地址的映射,反向映射是从物理页面到虚拟地址空间VMA的反向映射. RMAP能否实现的基础是通 ...
- [内存管理]linux内存管理 之 内存节点和内存分区
Linux支持多种硬件体系结构,因此Linux必须采用通用的方法来描述内存,以方便对内存进行管理.为此,Linux有了内存节点.内存区.页框的概念,这些概念也是一目了然的. 内存节点:主要依据CPU访 ...
- Linux内存管理 (25)内存sysfs节点解读
1. General 1.1 /proc/meminfo /proc/meminfo是了解Linux系统内存使用状况主要接口,也是free等命令的数据来源. 下面是cat /proc/meminfo的 ...
- Linux内存管理 (16)内存规整
专题:Linux内存管理专题 关键词:内存规整.页面迁移.pageblock.MIGRATE_TYPES. 内存碎片的产生:伙伴系统以页为单位进行管理,经过大量申请释放,造成大量离散且不连续的页面.这 ...
- linux 进程管理和内存分配
1.进程相关概念 进程:正在运行中的程序 内核功用:进程管理.文件系统.网络功能.内存管理.驱动程序.安全功能等 Process:运行中的程序的一个副本,是被载入内存的一个指令集合 进程 ID(Pro ...
- Linux内存管理 (22)内存检测技术(slub_debug/kmemleak/kasan)
专题:Linux内存管理专题 关键词:slub_debug.kmemleak.kasan.oob.Redzone.Padding. Linux常见的内存访问错误有: 越界访问(out of bound ...
- Linux内存管理 (22)内存检测技术(slub_debug/kmemleak/kasan)【转】
转自:https://www.cnblogs.com/arnoldlu/p/8568090.html 专题:Linux内存管理专题 关键词:slub_debug.kmemleak.kasan.oob. ...
随机推荐
- python面向对象的反射
python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) getattr # 根据字符串的形式,去对象中找成员.hasattr # 根据字符 ...
- 1196/P2323: [HNOI2006]公路修建问题
1196: [HNOI2006]公路修建问题 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2191 Solved: 1258 Descriptio ...
- CC3200串口UART1配置
1. 首先打开工程\CC3200SDK_1.1.0\example\adc\ewarm,以ADC例程为例,修改串口引脚复用,先看下引脚图 2. 修改引脚复用代码 void PinMuxConfig(v ...
- 玩转Node.js(三)
玩转Node.js(三) 上一节对于Nodejs的HTTP服务进行了较为详细的解析,而且也学会了将代码进行模块化,模块化以后每个功能都在单独的文件中,有利于代码的维护.接下来,我们要想想如何处理不同的 ...
- 架构师速成6.7-设计开发思路-uml 分类: 架构师速成 2015-07-29 18:25 157人阅读 评论(0) 收藏
uml是什么东西?统一建模语言,一门语言,是用来进行软件设计的一门语言. 其实一门语言的诞生并不伟大,让大多数人都使用才足够伟大.uml就是一门伟大的语言,因为目前软件设计的唯一语言就是它. UML其 ...
- Python第三方模块tesserocr安装
介绍 在爬虫过程中,难免会遇到各种各样的验证码,而大多数验证码还是图形验证码,这时候我们可以直接用 OCR 来识别. tesserocr 是 Python 的一个 OCR 识别库 ,但其实是对 tes ...
- 板载raid 安装Ubuntu 黑屏
最近有碰到过产线反馈supermicro x10主板板载raid安装ubuntu桌面版 ,出现安装完成后黑屏,现象是能正常识别faker raid 但是第一次重启,就会出现黑屏,只有左上角广光标在闪, ...
- 一个初学者的辛酸路程-初识Django
前言: 主要是关于JavaScript的高级部分以及Django 主要内容: 一.jQuery 事件绑定: DOM事件绑定: -直接在标签上绑定 第一种: $('.title').click(func ...
- Python数据分析-Matplotlib图标绘制
Matplotlib介绍 Matplotlib是一个强大的Python绘图和数据可视化的工具包. Matplotlib的主要功能 Matplotlib是python中的一个包,主要用于绘制2D图形(当 ...
- web浏览器中的javascript -- 2
在html里嵌入javascript: 在html文档里嵌入客户端javascript代码有4种方式: 1.内联,放置在<script>和</script>标签对之间; 2.放 ...