OS-李治军-L23-段页结合的实际内存管理
段页结合的实际内存管理
底层希望段管理,用户希望页管理...如何结合呢?
这就引出了虚拟内存的概念。
我们设置一种地址空间,称之为虚拟内存,向上,可以为用户提供段;向下,将段映射到物理帧上。

对用户来说,是段的使用,对物理内存来说,是页的使用。
寻址:
用户给出CS: IP,先查段表,访问某个段内的东西,得到一个虚拟地址;然后再查页表,得到物理地址。

总结:操作系统使用了两层映射,向上为用户提供段操作,向下为硬件提供分页管理
实际的东西:
程序如何载入内存?
1.割出段
2.建立段表
3.映射到内存
4.建立页表
5.可以用重定位寻址

下面是为父进程copy一个子进程,在内存上的操作:

p是pcb,nr是pcb的号码,每个人从虚拟内存中割出64M空间,作为分给程序的段,将基地址分给pcb的ldt。
以上代码完成了1,2两步。

我们可以发现虚拟地址不重叠,所以对应的页号不重叠,所以可以共用一套页表。实际上可能是会有重叠的,所以每个进程都应该要有自己的页表。
现在要完成二次映射,分页建立页表。

共用父进程的内存,所以没有分配内存,但有建立页表的部分。

本来是右移22位,但是得到的只是索引号,具体的地址还要4,因为每项的大小是4,>>224=>>20且右边两位清零。

现在要用到新的页表项,所以要为其分配实际的物理内存页,原先是没有的,这体现了分级页表的特点,申请由mem_map完成,注意内存是本来就须臾原先进程的。

上面是赋值部分,简单了。注意小细节,mem_map的值加1,表示引用这块内存的程序+1。
以上完成了步骤3,4。
最后一步:
最后看*p=7是怎么工作的,实际上是映射都是由硬件部分mmu完成。


浙公网安备 33010602011771号