内存分页机制

引言:

操作系统和硬件是相互依赖和发展起来的。

程序需要分段,操作系统提供分页。

在保护模式下,段描述符GDT是内存段的身份证。GDTR寄存器保存了GDT的起始地址。通过选择子去拿到段基址,GDT段描述符中的内存段不一定都在内存中,其中一位做标记做标记位。灵活的做内存的换入换出。

如果内存太小以至于不能容下一个进程?用户能够忍受整个段换入换出的IO时延?碎片太多怎么处理?

最本质原因是:连续的线性地址对应连续的物理地址。

=======》怎么处理?

我们要解除这种对应,然后建立新的映射。

 

分页机制

在未开启分页机制时,物理地址就由段基地址+偏移地址给出。

开启分页机制后,段基址(段选择号)+偏移地址给出的只是虚拟地址。分页机制负责完成虚拟地址到物理地址的映射。

cr3 寄存器保存了页目录的物理地址。 cr0 寄存器有负责打开分页机制的控制位。

我们以虚拟内存4G为例,一个页4KB,一个段对应一个页表。如果一个页表对应了所有的物理页框,则会造成页表项过大的情况一个页表就有4MB,在程序有多个段的情况下页表占用的空间就会很大。

为了解决这个问题==》

出现了多级页表的思考。(来源于生活中翻书时,我们都是先看目录选择到某一章,然后再翻到某一节,不是该章的内容,我们呢就不看)

4KB(页目录的1024项,每一项本质都是指针) * 4KB(每一项都是1024个页框) 一个段最大16KB

具体映射:页目录的起始地址(cr3中有保存)+ 虚地址的高10位(数组下标)  * 4(每一项4个字节)得到第一级物理地址

读取该物理地址,该物理地址 + 虚地址的中间10位(数组下标) * 4的页项中 得到物理页框地址,加上后十二位偏移地址得到最后的物理地址。

 

页表项和页目录项都是4个字节,但是他们对应的单位都是4kb,所以只需要记录20位即可,留下12位可以保存其他属性。

物理页框和虚地址的映射可以不线性连续。

 

posted @ 2022-11-29 22:39  stu--wy  阅读(157)  评论(0)    收藏  举报