学完本章,各位就能够真正的理解虚拟内存和物理内存之前的关系了
前面我们讲过每个进程都有自己4GB的虚拟内存,其中第2GB各不相同,而高2GB所有进程都是同用的,虚拟内存机制可以实现,不同进程空间的隔离,A进程只能访问A进程的空间,B进程只能访问B进程的空间,从而是A进程挂了不会响应B进程,如果高2GB挂了那就所有进程都挂了直接蓝,不同进程之间的隔离是因为进程的低2GB映射的物理页都不同,访问A的0x10000000地址和B进程0x10000000实际访问的是不同的物理页,这就出现了一个问题,CPU如果知道你访问的0x10000000地址空间是哪一个进程的,A,B,..N进程的? 这就说明肯定得根据一个东西来指定是那个进程的吧,所以CR3寄存器出来了,每个进程的Cr3都不同,CPU通过CR3的值就找到这个进程的4GB虚拟空间,那一块对应的物理页在哪里。
一个现代化的操作系统有几个要求
1:不同进程的虚拟地址别映射到了物理内存不同的地方(这个过程是以页为单位的(小页4KB)),每个进程的低2GB虚拟内存都 被映射到了不同的物理页,这就解决了不同进程间隔离的问题,哪怕所有进程都访问一个线程地址,实际上访问的都是不同的 物理页
2:把CPU分为内核态和用户态,在用户态的时候可以访问进程低2GB空间,而高2GB可以访问整个4GB空间把,虚拟地址空间分 成了两份,用户空间和内核空间,CPU运行用户态是就没有权限访问内核空间,就实现了对操作系统的保护
而上面这两点都是页机制做的,我们之前提过保护模式保护的主要是内存,有段的保护和页的保护,但是对内存的保护段机制做的很少,主要的保护都是页做的
在这张章我们就得改变对内存的看法,以前我们注意都只是线程地址,也都知道如果访问0线程地址,会返回一个0xC0000005异常,那么从现在开发我们要注意的只能是物理页,每个进程4GB的虚拟地址,其中绝大多数是是没有使用的(就是没有挂上物理页的),也就是说只要能访问的线性地址都挂上了物理页,我们用的VirtualAlloc函数就是可以在给线性地址挂上物理页。
32位系统,分页模式有两种10-10-12分页和2-9-9-12分页
起始仔细的品读这句话,分页分页,就是把虚拟空间,分成一个个的页,每个页0x1000大小
而10-10-12分页是把一个线性地址分成三部分,高10位,中间10位,低12位
10-10-12分页 CR3指向一张表(PDT)首地址这张表大小一个页,PDT表有1024项,每项4个字节(PDT的每一项我们称为PDE),而每个PDE指向一张表PTT(页表)大小一个页,PTT表每项占4字节,每项称为PTE,每个PTE指向一个物理页
所以通过这个PDT表,可以只找到1024张PTT表,每张PTT表可以找到1024个物理页,所以通过1024张PTT表可以找到1024*1024个物理页=4GB物理内存,所以10-10-12分页机制能够识别的物理内存就是4GB
P位:P位=1表示页有效,P位=0表示页无效
R/W位:R/W=1表示描述的物理页可读可写,R/W=0表示描述的页只读
U/S位;U/S=1表示这个物理页允许CPL<=3,用户态和内核态访问,U/S=0表示这个物理页只允许CPL=0内核态访问
就是说内核可以访问用户空间,而用户不可以访问内核空间(实现了对操作系统的保护)
A位:访问位,该页是否被访问过
G位:G位=1是全局页,G位=0非全局页
PS位:PS=1表示大页 ,PS=0表示小页 (10-10-12大页4MB)(2-9-9-12大页2MB),小页4KB
10-10-12分页2级页表,通过Cr3找到PDT表基地址,线性地址高10位为PDT表索引,找到的PDT项指向PTT表,每个PTT项指向一个物理页
10-10-12分页能够识别的物理地址是4GB:因为PTE指向物理页,高20位+加上清0的低12位,一共只有32位,所有最大的物理地址寻址范围是4GB,而不是因为10*10*12=4GB所有物理内存最多设备四GB,而是因为PTE只有32位表示物理地址,你就是有1TB的内存,能识别的也将4GB物理内存,所有10-10-12分页很快的被2-9-9-12分页取代了,
2-9-9-12分页,PTE项有8个字节64位,理论上来说可以识别的物理地址是2^64BYTE,但是并没有使用全部的64位,而是只使用了36位,寻址范围可达64GB,PDE也有64位,是因为有些PTT可能物理地址超出了4GB,如果PDE只有32位,就找不到PTT,所以PDE项也有64位,2-9-9-12分页机制的PDE,PTE的低12位和10-10-12分页机制的一样是都是属性
2-9-9-12的12-35位是物理地址,虽然PDE和PTE都有64位,但是只使用36位,可以说是硬件的发展跟不上软件的发展吧,
所以2-9-9-12分页又称为物理地址扩展PAE。
2-9-9-12分页将一个线性地址分为4部分,30-31位 ,21-29位,12-20位 ,0-11位这4个部分,10-10-12是级寻址,2-9-9-12是3级寻址,如图下
不管是10-10-12分页还是2-9-9-12分页cr3都是4字节,且里面存储的都是物理地址,2-9-9-12分页下,所以PT表必须在低4GB物理地址中,否则CR3找不到PDPT表,再次声明程序中出现的所有地址都是线性地址,CPU都会将它当成线性地址,只有Cr3寄存器中存储的是物理地址,其他的所有地址都必须经过MMC存储管理单元的运算,将线性地址转化位物理地址,操作系统也不能操作不了物理地址,那么重点来了,操作系统如何给程序开辟内存,这是最重要的一点,所以一定有一段线性地址映射到那些物理地址,通过操作这个对应的线性地址就是操作那个对应的物理地址,
如10-10-12分页1个PDT表4KB,这1个PDT表可以寻址到1024个PTT表 所以要将这1个PDT和1024个PTT与线性地址映射起来需要
4MB内存,操作系统将其映射到了0xC0000000-0xC04000000 正好6MB内存
而2-9-9-12分页有4个PDT表,512*4*4KB=8MB内存存储PTT表,操作系统将其映射到了
0xC0000000-0xC0800000正好8MB内存,而操作系统通过操作这些PTT可以给进程挂上物理页
注意PDPT表只有4项,每项8个字节,因为每个进程只有4GB线性地址你不可能个4GB线性地址挂上超过4GB的物理内存
每个PDPTE项可以给1GB线性地址寻址1GB物理内存,与之相对应
线性地址的最高2位为0 寻址 0x00000000-0x3FFFFFFF
线性地址的最高2位为1寻址 0x40000000-0x7FFFFFFF
线性地址的最高2位为2寻址 0x80000000-0xBFFFFFFF
线性地址的最高2位为3寻址 0xC0000000-0xFFFFFFFF
!process 0 0 可以看到
kd> !dq 0c080300+3*8 取PDPT表第4项 下标为3 # c080318 00000000`116d3001 00000000`1b75a001 //116d3000物理页就存储这第4个PDT表 # c080328 00000000`1b75b001 00000000`1b59c001 # c080338 00000000`1b719001 00000000`186b7001 # c080348 00000000`18578001 00000000`185b9001 # c080358 00000000`184b6001 00000000`19130001 # c080368 00000000`191b1001 00000000`191f2001 # c080378 00000000`1906f001 00000000`f8d811c0 # c080388 00000000`1b236001 00000000`114b7001 kd> !dq 116d3000+3*8 取第4个PDT的第4项下标位3 #116d3018 00000000`116d3063 00000000`11397063 116d3000存储这一个PTT表 #116d3028 00000000`115da063 00000000`00000000 #116d3038 00000000`028f6163 00000000`028f7163 #116d3048 00000000`028f8163 00000000`028f9163 #116d3058 00000000`028fa163 00000000`028fb163 #116d3068 00000000`028fc163 00000000`028fd163 #116d3078 00000000`028fe163 00000000`028ff163 #116d3088 00000000`02a00163 00000000`02941163 kd> !dq 116d3000 这个PTT的第1项下标位0对应的PTE指向的是logon的C0600000线性 #116d3000 00000000`1a394063 00000000`1bfd5063 的物理页1a394000 #116d3010 00000000`1f996063 00000000`116d3063 #116d3020 00000000`11397063 00000000`115da063 #116d3030 00000000`00000000 00000000`028f6163 #116d3040 00000000`028f7163 00000000`028f8163 #116d3050 00000000`028f9163 00000000`028fa163 #116d3060 00000000`028fb163 00000000`028fc163 #116d3070 00000000`028fd163 00000000`028fe163 kd> !dq 1a394000 #1a394000 00000000`00aea067 00000000`0e33d067 #1a394010 00000000`03c54067 00000000`0691e067 #1a394020 00000000`00a70067 00000000`009e3067 #1a394030 00000000`00000000 00000000`00000000 #1a394040 00000000`0ca69067 00000000`00000000 #1a394050 00000000`00000000 00000000`00000000 #1a394060 00000000`00000000 00000000`00000000 #1a394070 00000000`00000000 00000000`00000000 kd> !dq 0c080300 CR3指向的PDPT表只有4项 # c080300 00000000`1a394001 00000000`1bfd5001 这一看到PDPT的第1项就指向的是1a394000第一个PDT表 # c080310 00000000`1f996001 00000000`116d3001 存储在这个进程的C0600000线性地址对应的物理页中 # c080320 00000000`1b75a001 00000000`1b75b001 # c080330 00000000`1b59c001 00000000`1b719001 # c080340 00000000`186b7001 00000000`18578001 # c080350 00000000`185b9001 00000000`184b6001 # c080360 00000000`19130001 00000000`191b1001 # c080370 00000000`191f2001 00000000`1906f001
看看logon进程的0xC0601000线性地址里存储的是什么
kd> !dq 0c080300 +3*8 去PDPT表中的第4项下标为3 得到116d3000指向第四个PDT表的物理 # c080318 00000000`116d3001 00000000`1b75a001 地址 # c080328 00000000`1b75b001 00000000`1b59c001 # c080338 00000000`1b719001 00000000`186b7001 # c080348 00000000`18578001 00000000`185b9001 # c080358 00000000`184b6001 00000000`19130001 # c080368 00000000`191b1001 00000000`191f2001 # c080378 00000000`1906f001 00000000`f8d811c0 # c080388 00000000`1b236001 00000000`114b7001 kd> !dq 116d3000+3*8 取第四个PDT表的第4项下标为3得到PDE 116d3000指向一个PTT #116d3018 00000000`116d3063 00000000`11397063 116d3000 #116d3028 00000000`115da063 00000000`00000000 #116d3038 00000000`028f6163 00000000`028f7163 #116d3048 00000000`028f8163 00000000`028f9163 #116d3058 00000000`028fa163 00000000`028fb163 #116d3068 00000000`028fc163 00000000`028fd163 #116d3078 00000000`028fe163 00000000`028ff163 #116d3088 00000000`02a00163 00000000`02941163 kd> !dq 116d3000+1*8 取这个PTT的第2项下标为1得到PTE =1bfd5000指向0xC0601000线性 #116d3008 00000000`1bfd5063 00000000`1f996063 对应的物理页 1bfd5000 对应的物理页是第二张PDT表 #116d3018 00000000`116d3063 00000000`11397063 #116d3028 00000000`115da063 00000000`00000000 #116d3038 00000000`028f6163 00000000`028f7163 #116d3048 00000000`028f8163 00000000`028f9163 #116d3058 00000000`028fa163 00000000`028fb163 #116d3068 00000000`028fc163 00000000`028fd163 #116d3078 00000000`028fe163 00000000`028ff163 kd> !dq 1bfd5000 #1bfd5000 00000000`00000000 00000000`00000000 #1bfd5010 00000000`00000000 00000000`00000000 #1bfd5020 00000000`00000000 00000000`00000000 #1bfd5030 00000000`00000000 00000000`00000000 #1bfd5040 00000000`00000000 00000000`00000000 #1bfd5050 00000000`00000000 00000000`00000000 #1bfd5060 00000000`00000000 00000000`00000000 #1bfd5070 00000000`00000000 00000000`00000000
kd> !dq 0c080300 # c080300 00000000`1a394001 00000000`1bfd5001 可以看到logon进程的0xC0601000线性地址对应的物理页是第二张 # c080310 00000000`1f996001 00000000`116d3001 PDT表 # c080320 00000000`1b75a001 00000000`1b75b001 # c080330 00000000`1b59c001 00000000`1b719001 # c080340 00000000`186b7001 00000000`18578001 # c080350 00000000`185b9001 00000000`184b6001 # c080360 00000000`19130001 00000000`191b1001 # c080370 00000000`191f2001 00000000`1906f001
logon线性地址0xC0602000
前两步就省略了
kd> !dq 116d3000+2*8 #116d3010 00000000`1f996063 00000000`116d3063 0xC0602000线性地址对应的物理页 1f996000 #116d3020 00000000`11397063 00000000`115da063 是PDPT的第3个PDT表 #116d3030 00000000`00000000 00000000`028f6163 #116d3040 00000000`028f7163 00000000`028f8163 #116d3050 00000000`028f9163 00000000`028fa163 #116d3060 00000000`028fb163 00000000`028fc163 #116d3070 00000000`028fd163 00000000`028fe163 #116d3080 00000000`028ff163 00000000`02a00163 kd> !dq 1f996000 #1f996000 00000000`0034a163 00000000`0034b163 #1f996010 00000000`004001e3 00000000`006001e3 #1f996020 00000000`0034e163 00000000`0034f163 #1f996030 00000000`00350163 00000000`00351163 #1f996040 00000000`010001e3 00000000`012001e3 #1f996050 00000000`014001e3 00000000`016001e3 #1f996060 00000000`018001e3 00000000`01a001e3 #1f996070 00000000`01c001e3 00000000`01e001e3
kd> !dq 0c080300 Cr3 # c080300 00000000`1a394001 00000000`1bfd5001 # c080310 00000000`1f996001 00000000`116d3001 第三章PDT表在1f996000物理页 # c080320 00000000`1b75a001 00000000`1b75b001 # c080330 00000000`1b59c001 00000000`1b719001 # c080340 00000000`186b7001 00000000`18578001 # c080350 00000000`185b9001 00000000`184b6001 # c080360 00000000`19130001 00000000`191b1001 # c080370 00000000`191f2001 00000000`1906f001
logon线性地址的0xC0603000
kd> !dq 116d3000+3*8 #116d3018 00000000`116d3063 00000000`11397063 #116d3028 00000000`115da063 00000000`00000000 #116d3038 00000000`028f6163 00000000`028f7163 #116d3048 00000000`028f8163 00000000`028f9163 #116d3058 00000000`028fa163 00000000`028fb163 #116d3068 00000000`028fc163 00000000`028fd163 #116d3078 00000000`028fe163 00000000`028ff163 #116d3088 00000000`02a00163 00000000`02941163 kd> !dq 116d3000 进程logon 0xC0603000线性对应的物理页是第4张PDT表 #116d3000 00000000`1a394063 00000000`1bfd5063 #116d3010 00000000`1f996063 00000000`116d3063 #116d3020 00000000`11397063 00000000`115da063 #116d3030 00000000`00000000 00000000`028f6163 #116d3040 00000000`028f7163 00000000`028f8163 #116d3050 00000000`028f9163 00000000`028fa163 #116d3060 00000000`028fb163 00000000`028fc163 #116d3070 00000000`028fd163 00000000`028fe163
kd> !dq 0c080300 CR3 # c080300 00000000`1a394001 00000000`1bfd5001 # c080310 00000000`1f996001 00000000`116d3001 # c080320 00000000`1b75a001 00000000`1b75b001 # c080330 00000000`1b59c001 00000000`1b719001 # c080340 00000000`186b7001 00000000`18578001 # c080350 00000000`185b9001 00000000`184b6001 # c080360 00000000`19130001 00000000`191b1001
2-9-9-12分页下
总结进程的0xC06000000-0xC0603000线性地址对应的物理页分别存储第一个PDT表到第4个PDT表
而通过当前进程CR3指向PDPT表只有四项,每项指向一PDT表基址
第一个PDT表可以寻址0x00000000-0x3FFFFFFF 这个PDT表映射的线性地址是0xC0600000
第二个PDT表可以寻址0x40000000-0x7FFFFFFF 这个PDT表映射的线性地址是0xC0601000
第三个PDT表可以寻址0x80000000-0xBFFFFFFF 这个PDT表映射的线性地址是0xC0602000
第四个PDT表可以寻址0xC0000000-0xFFFFFFFF 这个PDT表映射的线性地址是0xC0603000
注意的是仔细看上面第0xC0600000地址拆分的时候可以看到这个线性地址对应物理页既是的PDT表有是PTT表
本来就是2-9-9-12PTT表有 4KB*512*4=8M线性地址存储,还有4个PDT,这四个PDT存储在0xC0600000-0xC0603000
这个四个PDT表都既是PDT也是PTT表,否则8M的内存是不够的
明白了上述的继续开始看logon进程0xC0000000线性地址
kd> !dq 0c080300+3*8 # c080318 00000000`116d3001 00000000`1b75a001 # c080328 00000000`1b75b001 00000000`1b59c001 # c080338 00000000`1b719001 00000000`186b7001 # c080348 00000000`18578001 00000000`185b9001 # c080358 00000000`184b6001 00000000`19130001 # c080368 00000000`191b1001 00000000`191f2001 # c080378 00000000`1906f001 00000000`f8d811c0 # c080388 00000000`1b236001 00000000`114b7001 kd> !dq 116d3000 PDT表第1项索引为0指向PTT 116d3000物理页是第四个PDT #116d3000 00000000`1a394063 00000000`1bfd5063 #116d3010 00000000`1f996063 00000000`116d3063 #116d3020 00000000`11397063 00000000`115da063 #116d3030 00000000`00000000 00000000`028f6163 #116d3040 00000000`028f7163 00000000`028f8163 #116d3050 00000000`028f9163 00000000`028fa163 #116d3060 00000000`028fb163 00000000`028fc163 #116d3070 00000000`028fd163 00000000`028fe163 kd> !dq 1a394000 PTT索引位0指向PTE 00aea000是进程logon0xC0000000 线性 #1a394000 00000000`00aea067 00000000`0e33d067 地址对应的物理与 ,1a394000物理地址是第一张PDT表,又是一PTT #1a394010 00000000`03c54067 00000000`0691e067 #1a394020 00000000`00a70067 00000000`009e3067 #1a394030 00000000`00000000 00000000`00000000 #1a394040 00000000`0ca69067 00000000`00000000 #1a394050 00000000`00000000 00000000`00000000 #1a394060 00000000`00000000 00000000`00000000 #1a394070 00000000`00000000 00000000`00000000 kd> !dq 00aea000 # aea000 00000000`00000000 00000000`00000000 # aea010 00000000`00000000 00000000`00000000 # aea020 00000000`00000000 00000000`00000000 # aea030 00000000`00000000 00000000`00000000 # aea040 00000000`00000000 00000000`00000000 # aea050 00000000`00000000 00000000`00000000 # aea060 00000000`00000000 00000000`00000000 # aea070 00000000`00000000 00000000`00000000 kd> !dq 0c080300 # c080300 00000000`1a394001 00000000`1bfd5001 # c080310 00000000`1f996001 00000000`116d3001 # c080320 00000000`1b75a001 00000000`1b75b001 # c080330 00000000`1b59c001 00000000`1b719001 # c080340 00000000`186b7001 00000000`18578001 # c080350 00000000`185b9001 00000000`184b6001 # c080360 00000000`19130001 00000000`191b1001 # c080370 00000000`191f2001 00000000`1906f001
可以看到0xC0000000线性地址拆分的时候查询的PDT是第四张,PTT是第一张PDT,对应的物理页是第一张PDT第一项的指向的物理页是一个PTT
再来好好捋清楚,0xC0000000 按2-9-9-12拆分 3 0 0 0
3索引PDPT表的第4项是第4张PDT表,在线性地址0xC06030000对应的物理页
0索引的是第四个PDT表第1项,PDE指向的是第一个PDT表在这里应该叫做PTT
0索引的是这个PTT的第1项,是一个PTE指向一个物理页
通过这个特性我们可以知道,
0xC0000000线性地址对应的物理页,第一张PDT表的第一项索引为0指向的物理页 是一个PTT 第一张PTT表
0xC0001000线性地址对应的物理页,第一张PDT表的第二项索引为1指向的物理页 是一个PTT 第二张PTT表
0xC0002000线性地址对应的物理页,第一张PDT表的第三项索引为2指向的物理页(是一个PTT)第三张PTT表
0xC0000000-0xC01FFFFFF这个2MB内存存储的是第一张PDT表指向的所有PTT,
一个PTT可以索引的内存是 4KB*512KB=2MB 而0xC0000000-0xC01FFFFFF 存储了第一个PDT的所有PTT页
0xC0000000-0xC01FFFFFF这段线性地址可以个0x00000000-0x3FFFFFFF这1GB线性地址挂上物理页
0xC0200000-0xC03FFFFFF这段线性地址可以个0x40000000-0x7FFFFFFF这1GB线性地址挂上物理页
0xC0400000-0xC05FFFFFF这段线性地址可以个0x80000000-0xBFFFFFFF这1GB线性地址挂上物理页
0xC0600000-0xC07FFFFFF这段线性地址可以个0xC0000000-0xFFFFFFFF这1GB线性地址挂上物理页
所以如果我们要给那个进程在2-9-9-12下挂上物理页
PDPI是线性地址高2位 30-31位
PDTI是线性地址的 21-29位
PTEI是线性地址的 12-10
2-9-9-12计算公式
PDE的公式=0xC0600000+PDPI*4KB+PDTI*8
PTE的公式=0xC0000000+PDPI*2MB+PDTI*4KB+PTEI*8
当这个公式在化简就是
PDE=0xC0600000+((address>>18)&0x3FF8);
PTE=0xC0000000+((address)>>9)&0x3ffff8);
我们看到很多人的博客写了这个公式,就直接一写,当然照这个公式用的话没有问题,但是想直接理解透(对于刚学页机制的人来说太难了),通过上面地址的拆分,然后在看这个公式觉得太简单,一切理所应当的
PDPI*4KB+0xC0600000是为了锁定PDT表 PDTI*8是为了锁定对于的PTE
因为每个进程PDT表只有4个 PDPI是为了索引PDT表
当线性地址在0x00000000-0x3FFFFFFF的时候PDPI=0 对应第1张PDT表 0xC0600000-0xC0600FFF这个线性地址的物理页
当线性地址在0x40000000-0x7FFFFFFF的时候PDPI=1 对应第2张PDT表
当线性地址在0x80000000-0xBFFFFFFF的时候PDPI=2 对应第3张PDT表
当线性地址在0xC0000000-0xFFFFFFFF的时候PDPI=3 对应第4张PDT表
10-10-12分页情况类似,但是更加的简单,所以就不多陈述了,下面的0xC0200000线性地址的拆分
这个线性地址会把第二张PDT表当成PTT,每一个物理页都是第二张PDT表中所指向PTT
其他的就需要各位自己理解
所有线性地址0xC0200000-0xC03FFFFF对应的是物理页存储的是第二张PDT表的所有PTT
kd> !dq 0c080300+3*8 # c080318 00000000`116d3001 00000000`1b75a001 # c080328 00000000`1b75b001 00000000`1b59c001 # c080338 00000000`1b719001 00000000`186b7001 # c080348 00000000`18578001 00000000`185b9001 # c080358 00000000`184b6001 00000000`19130001 # c080368 00000000`191b1001 00000000`191f2001 # c080378 00000000`1906f001 00000000`f8d811c0 # c080388 00000000`1b236001 00000000`114b7001 kd> !dq 116d3000+1*8 1bfd5000第四章PDT表 #116d3008 00000000`1bfd5063 00000000`1f996063 #116d3018 00000000`116d3063 00000000`11397063 #116d3028 00000000`115da063 00000000`00000000 #116d3038 00000000`028f6163 00000000`028f7163 #116d3048 00000000`028f8163 00000000`028f9163 #116d3058 00000000`028fa163 00000000`028fb163 #116d3068 00000000`028fc163 00000000`028fd163 #116d3078 00000000`028fe163 00000000`028ff163 kd> !dq 1bfd5000 第二张PDT表这里是PTT #1bfd5000 00000000`00000000 00000000`00000000 #1bfd5010 00000000`00000000 00000000`00000000 #1bfd5020 00000000`00000000 00000000`00000000 #1bfd5030 00000000`00000000 00000000`00000000 #1bfd5040 00000000`00000000 00000000`00000000 #1bfd5050 00000000`00000000 00000000`00000000 #1bfd5060 00000000`00000000 00000000`00000000 #1bfd5070 00000000`00000000 00000000`00000000 kd> !dq 0c080300 # c080300 00000000`1a394001 00000000`1bfd5001 # c080310 00000000`1f996001 00000000`116d3001 # c080320 00000000`1b75a001 00000000`1b75b001 # c080330 00000000`1b59c001 00000000`1b719001 # c080340 00000000`186b7001 00000000`18578001 # c080350 00000000`185b9001 00000000`184b6001 # c080360 00000000`19130001 00000000`191b1001 # c080370 00000000`191f2001 00000000`1906f001
0xC0200000-0xC03FFFFF这段线性地址对应的物理页存储的是第二张PDT的所有PTT,能够所以的线性地址