- 操作系统内存管理的核心就是基于虚拟内存的分段和分页,而用内存换入换出来实现虚拟内存。
L24 内存换入-请求调页
换入换出的引入
由前所述,从程序员角度来看,一个程序需要划分为多个程序段存储在内存中;从物理内存角度来看,应该将物理内存划分为一页一页分配给程序;所以为了既实现分段,又实现分页,就要引入虚拟内存,实现一个实际的段页式内存管理;而为了实现虚拟内存,就需要内存换入换出。
★操作系统内存管理的核心就是基于虚拟内存的分段和分页,而用内存换入换出来实现虚拟内存。
物理内存对于用户来说是透明的,从用户的角度来看,他就好像是在用一个 4G 大小的内存空间,并且可以随意使用。
但实际上,如果该虚拟内存不映射到物理内存上,那么该虚拟内存是无法使用的,而且,实际的物理内存可能并没有 4G 这么大,比如图中的物理内存只有 1G 大小,所以需要物理内存的换入和换出,来实现“大内存”,以 1G 大小的物理内存,给用户以 4G 大小的使用内存的感觉。
★请求调页
首先用户请求访问内存,给出逻辑地址,操作系统通过段表加逻辑地址,就能找到对应于逻辑地址的虚拟地址;
然后操作系统根据虚拟内存查页表,如果能在页表中找到对应于虚拟内存的页表项,就可以得到对应于虚拟地址的物理内存地址;
反之,如果操作系统不能在页表中找到对应于虚拟内存的页表项,就需要通过中断,请求调页(在磁盘中找到对应于虚拟地址的页;在物理内存中申请一个空闲的页空间并将在磁盘中找到的页调入到该物理内存页中;填写页表,在页表中建立物理内存页和虚拟地址的映射。
一个实际系统的请求调页
从”缺页中断“切入,看请求调页的实际代码(缺页中断的中断号为 14 )。
do_no_page
函数的作用是在磁盘中找到所需的对应于虚拟地址的页,并从物理内存中得到一个空白页空间来存储磁盘中的该页,最后填写页表,在页表中建立物理内存页和虚拟地址的映射。(即 L24-4 图中的步骤(3)(4)(5))put_page
函数的作用就是上面所述的”填写页表“。