免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: gulang2004xy
打印 上一主题 下一主题

Linux的Virtual Memory Areas(VMA) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2011-08-29 20:28 |只看该作者
求推荐专门针对linux内存的资料。

论坛徽章:
0
12 [报告]
发表于 2011-08-30 09:22 |只看该作者
本帖最后由 muzi19861113 于 2011-08-30 09:28 编辑

VMA是用来描述进程用户空间的数据结构。
进程的用户空间的虚拟内存空间可以不是连续的,即可以是一段一段的。
每一段的虚拟内存空间都由一个VMA结构来描述。
当一个程序被加载到内存中运行时,OS会为这个进程的代码段数据段以及Stack段
都分配好一段虚拟内存空间,每一端空间都有一个VMA来表示。
其中代码段和数据段在整个线性空间的开始,Stack段在整个线性空间的末端。
在这个两者之间有一段巨大的虚拟内存的Hole,这个Hole就是用来在进程的运行过程中
用来动态内存分配的Heap段。
在OS为代码段,数据段,Stack段分配好VMA以后,会为这三个数据段分配相应的
物理内存,即Page Frame。这个动作就需要用到Buddy System。然后OS再为
这几段虚拟内存和物理内存建立好页面映射表。这样进程的这个几个段就可以使用了。
在程序运行过程中的动态内存分配是调用BRK 这个system call来实现的。
为什么叫BRK呢? 因为代码段和数据段后面的那段虚拟内存空间的起始点叫做Program Break。
而动态内存分配所做的动作就是从这个起始点开始为进程分配虚拟内存空间的。分配一次以后Program
Break的值就会增加所分配的长度,所以下一次分配就从这个Program Break开始了。
分配好VMA以后,OS不会立即为这个VMA分配Page Frame。
当进程需要使用这个快VMA的时候,由于没有相应的Page Table ,所以会触发Page Fault exception.
在这个异常的handler里面,OS才会为这个VMA分配Page Frame(调用Buddy System),建立Page Table。

进程的用户空间的内存分配不会调用SLAB模块的,SLAB模块是专门为Kernel的内存管理而设计的。

以上是本人的拙见,希望对你有帮助。

论坛徽章:
0
13 [报告]
发表于 2011-08-30 09:27 |只看该作者
关于内存管理的资料 我推荐你去看一下 MEL GORMAN的 <Understanding the Linux Virtual Memory Manager>
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP