页转换
这种转换主要是把线性地址(经过段转换过的)转换成物理地址。页转换是操作系统实现虚拟内存的基础,CPU也可以在也转换基础上实现页访问保护,增强系统的稳定性。
页转换是可选的,只有当CR0寄存器的PG为设为1的时候,CPU才进行页转换。一般PG位在系统初始化的时候由操作系统来设置。
1、页面
页面大小固定为4K(2^12)字节,必须为连续的物理内存。
2、线性地址
页转换过程中需要用查询页面目录表和页面表。32位线性地址包括两个表的索引。线性地址如下:
图1 线性地址的格式
线性地址的22-31位表示页面目录表中索引值,通过该索引可以查找该目录对应的页面表的物理地址。
线性地址的12-21位表示页面表的索引值,通过页面目录表的查询已经可以查询到该目录对应页面表物理地址,在此基础上用该索引值可以查询到页面的物理地址。
线性地址的0-11位为页内偏移地址,在页的物理地址基础上,加上该偏移地址即可得到所要访问的物理地址。
综上,页转换可以用下图进行宏观描述:
图2 页转换
3、页面目录表
页面目录表存在于内存中,其物理地址保存在CR3(或者称为PDBR)中,如果启用分页转换,则系统初始化的时候CR3必须进行初始化。CR3可以用MOV进行显示的初始化和在任务切换的时候进行隐式的初始化。
当任务切换的时候,必须要保证先把目标任务页目录表物理地址加载到CR3中,然后才能切换到该任务,并执行他。
4、页面目录表项和页面表项
下图展示了页面目录表项和页面表项:
图3 页面目录表项和页面表项
1)页表基地址
页面目录表项的12-31位表示,该目录对应的页表基地址(一个目录对应1k个页表,这里的基地址为第一个页表的物理地址)。注意CPU的这个设计要求页表必须要4K对齐,否则20位无法表示页表的基地址。
页表项的基地址表示该页的起始的物理地址。
2)可用位(Avail)
对于系统程序员可用,Intel不对此进行定义。
3)提交位(P)
表示改页面或者该目录是否已经提交到物理内存,如果已经提交,则为1,没有提交则为0。
其他的位都是和访问控制有关的位,主要用来提供页面访问控制,增强系统稳定性。
总结:
80386内存转换(开启页转换),可以用下图表示:
图4 80386内存转换
参考资料:
Intel 80386 programmer’s refference manual
IA-32 Intel® Architecture Software Developer’s Manual Volume 3: System Programming Guide