内存换入-请求调页
用换入、换出实现“大内存”
我们设置虚拟内存大小位4G,但是实际内存只有1G,所以虚拟内存没办法完整的映射到实际内存中,那么如何才能让用户觉得虚拟内存就是实际的内存呢?换入换出可以实现这一点,当用户使用虚拟内存的(0G-1G)时,就将这一段的虚拟内存映射到物理内存上,当用户使用(3G-4G)处的虚拟内存时,就将虚拟内存(3G-4G)映射到物理内存上,这样就相当于4G的虚拟内存都可以使用了
请求的时候才映射
请求调页
当MMU进行重定位时,发现虚拟内存没有映射,就会发起中断,同时不让PC+1,然后从磁盘中查找对应的页,再从内存中申请一段内存,将磁盘中读到的页放入内存中,再建立映射,最后中断返回,MMU重新计算,然后重新执行中断时的那一条指令。
一个实际系统的请求调页
请求调页,当然从缺页中断开始
中断号 名称 说明
12 Segment not present 描述符所指的段不存在
14 Page fault 页不在内存
void trap_init(void)
{
set_trap_gate(14, &page_fault);
}
#define set_trap_gate(n,addr) \
_set_gate(&idt[n], 15, 0, addr);
//在linux/mm/page.s
.globl _page_fault
xchgl %eax,(%esp) //错误码esp被压入栈中
...
movl $0x10, %edx