以4k页面为例,这里简单描述一下转换过程,熟悉得朋友可以跳过。首先,页目录Page Directory的基地址存放在CR3里面。线形地址的高[31:22]位作为对该目录的索引(为叙述方便,简写为IdxD: index directory),取得一个目录项也就是图中左边Directory Entry。Page Directory有pow(2,10)=1024项,也就是说,页目录可以索引1024个页表。如果我们以C语言的形式来表达可以写成(CR3)[IdxD]。这个目录项也是一个基地址,它索引一个页表:Page Table。页表也有pow(2,10)=1024项。这些项由线形地址的[21:12](称之为IdxT: index Table)索引。每一个项可以表示一个4K(pow(2,12),见下)大小的页面,用C语言数组方式表达为((CR3)[IdxD])[IdxT]。最后,线形地址低12位,也就是[11:0]作为页表的索引取得实际的物理地址,由表示的位数可以看出来,每张页表是4K。同样,C语言表示为(((CR3)[IdxD])[IdxT])[IdxP]。形象上说(或许不严谨),地址的变换是一个三维数组的遍历过程。最后,我们可以看见,总的地址寻址空间是1024*1024*4096=4G字节。That’s right。
[1] sys/i386/i386/swtch.s
[2] FreeBSD操作系统设计与实现
[3] ULE: A Modern Scheduler for FreeBSD
[4] Operation System concept(the six edition)
[5] Computer Systems: A Programmer's Perspective (CS:APP)
[6] A guide to how the FreeBSD kernel manages the IA32 processors in Protected Mode
[7] IA-32 Intel® ArchitectureSoftware Developer’s Manual