段页结合的实际内存管理
两种机制要结合在一起
将虚拟内存给定的地址空间中划分区域给段,建立映射关系就是建立段表,但是段表建立之后还不能使用,虚拟存在中区域打散,给内存再次完成映射,就是建立页表
段面向用户,页面向硬件
段、页同时存在是重定位(地址翻译):根据段号,找到页号,根据页号,找到物理页号
整个过程分为五步
1.将虚拟内存给定的地址空间中划分区域
2.用户段和,虚拟内存建立映射关系,建立段表
3..在物理内存中找到空闲页
4.建立映射关系,建立页表
5.使用内存(重定位)
new_data_base=nr*0x4000000,对应第一步,虚拟内存的分割
set_base(p->lat[1],new_data_base),set_base(p->lat[2],new_data_base);第二步设置段表填写段表,p是TCB,将p->ldt[1]设成new_data_base
分配虚拟内存建立段表
虚拟内存不重叠,所以页号也不重叠,共用一套页表共用一套页,不也分配内存,父进程已经分配了,但需要建立页表,建立页表也只需拷贝就可以
copy_page_tables(old_data_base,new_data_base,data_limit),拷贝页表,old_data_base父进程的虚拟地址的起始位置
from>>22得到目录项编号(章),应该右移22位,但是却右移了20位,(from>>22)*4每项4字节,22*4相当于22位左右2位,所以是20位
to_dir子进程的页目录,没创建子进程的时候,这个章是空的还没映射
get_free_page()分配物理内存页,把页的地址赋给to_dir
将父进程页表复制给子进程