引言:
操作系统和硬件是相互依赖和发展起来的。
程序需要分段,操作系统提供分页。
在保护模式下,段描述符GDT是内存段的身份证。GDTR寄存器保存了GDT的起始地址。通过选择子去拿到段基址,GDT段描述符中的内存段不一定都在内存中,其中一位做标记做标记位。灵活的做内存的换入换出。
如果内存太小以至于不能容下一个进程?用户能够忍受整个段换入换出的IO时延?碎片太多怎么处理?
最本质原因是:连续的线性地址对应连续的物理地址。
=======》怎么处理?
我们要解除这种对应,然后建立新的映射。
分页机制
在未开启分页机制时,物理地址就由段基地址+偏移地址给出。
开启分页机制后,段基址+偏移地址给出的只是虚地址。分页机制负责完成虚地址到物理地址的映射。
cr3 寄存器保存了页目录的物理地址。 cr0 寄存器有负责打开分页机制的控制位。
一个段对应一个页表。如果一个页表对应了所有的物理页框,则会造成页表项过大的情况--4MB。
为了解决这个问题==》
出现了多级页表的思考。(来源于生活中翻书时,目录的章和具体页的抽象)
具体映射:虚地址的高10位 * 4(每一项4个字节)+页目录的起始地址(cr3中有保存)得到第一级物理地址。
读取该物理地址,用虚地址的中间10位 * 4 + 该物理地址 得到分配的物理页地址,页框地址,加上后十二位偏移地址得到最后的物理地址。
页表项和页目录项都是4个字节,但是他们对应的单位都是4kb,所以只需要记录20位即可,留下12位做其他属性。
物理页框和虚地址的映射可以不线性连续。
标签:分页,物理地址,地址,内存,机制,页表 From: https://www.cnblogs.com/wuyun--wy/p/16935669.html