主要包括两部分: 进程地址空间的结构,进程动态内存的推迟分配(通过请求调页与缺页中断来实现的)。
推迟分配:用户态进程请求动态内存时,并未立即获得请求的页框,而是仅仅获得对一个线性区的访问权,仅当要用此区域时才真正通过缺页中断分配页框;通过这增加了系统中空闲页框的平均数,从而能够更好的利用空闲内存。
一. 进程的地址空间:
每个用户态进程都拥有自己的进程地址空间(0-3G),而内核地址空间(第4G)是所有进程所共享的(通过中断或系统调用来使用)。
进程描述符--->内存描述符--->线性区--->线性地址空间 : 注意后三者间的对应关系(本节核心)
无效线性地址的两种情况: 编程错误引发的无效地址, 由缺页引发的无效地址。
内核线程不使用线性区,故而其对应的进程描述符字段为NULL。但是其active_mm字段会被初始化为前一个运行进程的内存描述符。
线性区:
两种组织结构: 链表(顺序扫描用)与红黑树(快速确定指定地址的线性区)。进程内线性区不会发生重叠。若其相邻且权限一致则可进行合并操作。
相关权限:线性区的访问权限,页表访问权限,页描述符的flag字段标志。
线性区的创建及删除等操作及相应的辅助函数。
二. 缺页异常:
一个流程图:
三. 进程地址空间的创建爱你及删除,堆的管理
堆: 每个Unix进程都拥有一个特殊的线性区(堆),通过其用于满足进程动态内存的的请求。