- 论坛徽章:
- 0
|
本帖最后由 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的内存管理而设计的。
以上是本人的拙见,希望对你有帮助。 |
|