1)当用户进程向系统申请使用更多的内存,例如最常见的就是用标准库函数malloc要求在堆里面分配内存,LINUX的做法是把响应的过程分为两个阶段,分配虚拟内存空间和分配物理内存空间。如果没有系统的批准,即使是属于用户地址空间的虚拟地址,用户进程同样不能访问。所以,当系统接纳进程要求使用更多内存的申请后第一步要做的就是给进程分配一块虚拟地址区域,这个区域通常比进程实际申请的内存空间要稍微大一点,这样,进程就拥有了合法访问对应虚拟地址区域的权限。但是,系统并不会立即为进程真正分配物理内存页面,因为系统的策略是尽量推迟物理内存页面的分配。于是,内核会通过设置有关的页目录,页表等数据结构把刚刚分配的虚拟内存页面全部指向同一个物理内存页面(零页面),这个物理内存页面在系统初始化时就已经被零填充,并且属性是可读不可写。一旦进程真正开始使用申请到的内存页面,也就是说,往对应区域进行写操作,系统就会进入异常处理。直到这时系统才真正为进程分配对应的物理内存页面,然后重新设定页目录和页表,让虚拟内存页面对应新的物理内存页面。从异常返回后处理器会重新执行刚才那条引发异常的指令,就好像什么都没有发生。
阅读(772) | 评论(0) | 转发(0) |