引入PAE机制后,分页模式是怎样的呢?
首先,要搞明白几件事,2.6.11以上版本的linux内核中,存在4中页表(页全局目录,页上级目录,页中级目录,页表),这些页表结构是已经存在于硬盘中的,当进程被创建或这些页表被使用到时,将其调入物理内存(页框)中。而每一线性地址都与某目录项或表项对应,也就是说,根据每一线性地址都能特定地找到某一目录项,例如下面这个例子:
当某进程被创建时,此进程的页全局目录被调入物理内存(页框)中,页全局目录的地址被存入到进程控制块中,假如此时采用二级页表,需要寻址进程线性地址0x12345678的物理地址,步骤如下:
-
线性地址0x12345678的前10位为0x48,它就与页全局目录的第0x48项对应,它肯定存在于这一项多对应的页表中。
-
读present位,若所对应页表不在内存中,则将此页表调入,并设置这一项中的代表页框物理地址的20位的内容;否则若存在,则根据这一项中的代表页框物理地址的20位的内容,找到其所对应页表。
-
线性地址0x12345678的中间10位为0x345,它就与页表中第0x345项对应,它肯定村爱与这一项对应的页中。
-
读present位,若所对应页不在内存中,则将此页调入,并设置这一项中的代表页框物理地址的20位的内容;否则若存在,则根据这一项中的代表页框物理地址的20位的内容,找到其所对应页。
-
线性地址0x12345678的后12位为0x678,它就与0x678项对应,这一项的内容就是保存在此线性地址中的内容。
总之,每一目录项或页表项是包含下一级目录或页表或页的页框物理地址的,占20位。
PAE机制只是增加了物理内存大小,并且增加了内存中页框的数量,可以在内存中存放更多的页,如果想找到某页对应的页框地址,就需要24位来标明各个页框的物理地址,因为总的物理内存是64GB,每一页大小是4KB,共有64GB/4KB=2的24次方个页框。所以要增加目录项中代表页框物理地址的字段的位数。位数增加了,目录项数就减少了,如果还想映射32位线性地址空间的话,就要增加一级页表。这应该就是PAE机制的改进及特点。都是根据需要设置的。
下面我们来看看32位系统中,引入PAE后如何工作。
1、32位系统中,PAE未激活,PAE=0时,页上级目录标志位和页中级目录标志位置0,使用二级页表,页全局目录及页表共有1024项,每一项需要32位,其中20位为页框物理地址。
此时,32位线性地址划分为:10 10 12
2、32位系统中,PAE激活,PAE=1时,使用三级页表,页全局目录对应页目录指针表,页上级目录不用,页中级目录对应页全局目录,每目录或页表共有512项,每一项需要64位,其中24位为页框物理地址。
此时,32位线性地址划分为:2 9 9 12
64位系统中,采用三级页表还是四级页表,根据体系结构而定。例如x86中划分为:9 9 9 9 12.