《一个操作系统的实现》(三):3.页式存储

首先说一下页的概念~页就是一块内存。下文只讨论页大小为4KB的情况。

在未打开分页机制时,线性地址等同于物理地址,即可以认为逻辑地址通过分段机制直接转换成物理地址。但开启分页时分段机制将逻辑地址转换成线性地址,线性地址再通过分页机制转换成物理地址。分页管理机制的目的就在于实现虚拟存储器,这样的话线性地址中任意一个页都能映射到物理地址中的任何一个页,使内存管理变得相当灵活。

转换使用两级页表,第一级叫页目录,大小为4KB,存储在一个物理页中,每个表项4字节长,共有1024个表项。每个表项对应第二级的一个页表,第二级的每一个页表也有1024个表项,每一个表项对应一个物理页。页目录表的表项简称PDE(Page Directory Entry),页表的表项简称PTE(Page Table Entry)。进行转换时,先是从由寄存器cr3指定的页目录中根据线性地址的高10位得到页表地址,然后在页表中根据线性地址的第12到21位得到物理页首地址,将这个首地址加上线性地址低12位便得到了物理地址。

分页机制是否生效的开关位于cr0的最高位PG位(为1时生效)。

PDE和PTE各位的解释在这里就省略了,可以参见这篇文章,cr3的结构也在这篇文章中。

处理器会将最近常用的页目录和页表项保存在一个叫做TLB(Translation Lookaside Buffer,旁路转换缓冲or页表缓冲)的缓冲区中,只有在TLB中找不到被请求页的转换信息时才到内存中寻找,可以大大加快访问页目录和页表的时间。当页目录或页表项被更改时,操作系统应该马上使TLB中对应的条目无效,以便下次用到此条目时让它获得更新。当cr3被加载时,所有TLB都会自动无效,除非页或页表条目的G位被设置。

我们有必要知道内存有多大,然后根据内存大小确定多少页表是够用的,而且一个操作系统也必须知道内存的容量,以便进行内存管理。一般可利用中断15h来得到内存大小,还包括对不同内存段的一些描述(代码在pmtest7.asm中)。这篇文章讲了获取机器内存的三种方法,其中有中断15h的详细介绍~

对于不同进程有相同地址的情况,原理实在任务切换的时候通过改变cr3的值来切换页目录,从而改变地址映射关系。


这节虽然内容不少,但是写出来的内容没多少,不少内容都是在说什么代码实现了怎样的过程,就不在这赘述了。(唉,汇编的东西还是看得很晕,不求把这些汇编代码都理解,先把过程啊机制啊理解了再说~)

你可能感兴趣的:(操作系统)