1.IA-32e模式的作用
前面介绍了cpu运行的两种模式-实模式与保护模式,而这IA-32e模式则是cpu运行的第三种模式。它们之间的主要区别之一就在于cpu运行的位数。实模式中,cpu寄存器有效长度为16位。保护模式中,cpu寄存器有效长度为32位。而IA-32e模式中,cpu寄存器有效长度为64位。为什么需要在保护模式后再增加IA-32e模式呢?因为在保护模式下,寄存器有效长度为32位,这使得cpu最大的寻址范围就只能达到,也就是4GB。而现如今内存的大小早已经超过4GB了,所以需要更大的寻址位数来帮助cpu寻找内存上的地址。在IA-32e模式中,寻址范围理论上最大可达,也就是17179869184GB。
2.IA-32e模式的寻址方式
IA-32e模式寻址方式与保护模式寻址方式在前半部分相同,而在后半部分IA-32e模式强制开启了页表寻址方式。所以它们之间的区别在于IA-32e模式会在使用保护模式的寻址方式后继续使用页表寻址寻址。
前半段寻址方式与保护模式相同,区别在于在保护模式下所获取的物理地址在IA-32e模式中并不是物理地址而是Canonical型线性地址,而我们将会以这个地址为基础经过页表转化,最终成为物理地址。
2.1页表地址转化
如图,在通过段选择子的方式获得了
Canonical型线性地址后,还需经过页表的转换。页表转换地址的第一步就是先从cr3控制寄存器中寻找到PML4也就是第4级页表的基地址,然后再通过64位Canonical型线性地址中的第47~39位获得偏移量,通过偏移量选取页表中的页表项。通过页表项中的内容,确定PDPT第三级页表的基地址,再通过38~30位偏移量,选取页表中的页表项。如此重复4遍,就获得了物理地址页的地址,最终再加上12~0位的页内偏移,就可以得到物理地址。
2.2 cr3控制寄存器
其中PWT与PCD是用来决定内存访问PML4方式,置0。并且由于页表的最小大小为4KB所以PML4页表的物理地址需要乘上4096,也就是说在cr3控制寄存器内的数据就是PML4页表的物理地址。
2.3 PML4页表
与cr3控制寄存器不同的是,PML4页表项最后三位应该全置1,则以16进制表示后三位应该是0x007。也就是说,如果PDPT页表的物理基地址为0x92000,那么此时PML4页表项内的内容应该是0x92007
2.4 PDPT页表
从PML4页表到达了PDPT页表后,PDPT页表项与PML4有所不同。PDPT页表项有两种形式,它们取决于第7位是1还是0,如果第7位是0,则页表转换还需要继续进入下一步的PDT页表;如果第7位是1,那么页表转换就直接以当前页表项从第30位后开始选取1GB物理页,再加上30位以前的偏移量直接得到物理地址。也就是说,如果我们需要使用1GB物理页,则放置于PDPT的页表项应该以0x087结尾,而如果需要更小的物理页,则应该以0x007结尾。
2.5 PDT页表
与PDPT页表类似地,PDT页表也有两种形式,同样取决于第7位。如果第7位是0,页表转换依然需要继续进入下一步的PT页表;如果第7位是1,则页表转换以当前页表项从第22位后开始选取2MB物理页,再加上22位以前的偏移量直接得到物理地址。同样地,如果我们需要使用2MB物理页,则放置于PDT的页表项应该以0x087结尾,而如果需要更小的物理页,则应该以0x007结尾。
2.6 PT页表
最后一个页表PT页表大小为4KB,所以它只有一种形式,11位之前必须要为0x007,而11位之后则是4KB物理页的基地址。
3.页表寻址实例
假设我们此时为页表作如下数据结构的设置
;=== PML4页表
mov dword[0x90000], 0x91007
;=== PDPT页表
mov dword[0x91000], 0x92007
;=== PDT页表
mov dword[0x92000], 0x93007
;=== PT页表
mov dword[0x93000], 0x007 ;第0项
mov dword[0x93008], 0x1007 ;第1项,每项大小64位,即8字节
mov dword[0x93038], 0x7007 ;第7项,共7*8=56字节,16进制56=10进制38
;=== 设定cr3控制寄存器基地址
mov eax, 0x90000
mov cr3, ea
则此时寻址方式为