📄 jiurl玩玩win2k内存篇 分页机制 (四).htm
字号:
Reserved 00008003 000063C0 0 NP<BR>03C0 Reserved 00008003 000063C8 0
NP<BR>03C8 Reserved 00008003 000063D0 0 NP<BR>03D0 Reserved 00008003
000063D8 0 NP<BR>03D8 Reserved 00008003 000063E0 0 NP<BR>03E0 Reserved
00008003 000063E8 0 NP<BR>03E8 Reserved 00008003 000063F0 0 NP<BR>03F0
Reserved 00008003 000063F8 0 NP<BR>03F8 Reserved 00000000 00000000 0
NP<BR><BR>:dd 80036000 l 400<BR>0010:80036000 00000000 00000000 0000FFFF
00CF9B00 ................<BR>0010:80036010 0000FFFF 00CF9300 0000FFFF
00CFFB00 ................<BR>0010:80036020 0000FFFF 00CFF300 400020AB
80008B1F ......... .@....<BR>0010:80036030 F0000001 FFC093DF 00000FFF
0040F300 ..............@.<BR>0010:80036040 0400FFFF 0000F200 00000000
00000000 ................<BR>0010:80036050 00400068 80008947 00A80068
80008947 h.@.G...h...G...<BR>0010:80036060 2AB0FFFF 00009302 80003FFF
0000920B ...*.....?......<BR>0010:80036070 700003FF FF0092FF 0000FFFF
80009A40 ...p........@...<BR>0010:80036080 0000FFFF 80009240 00000000
00009200 ....@...........<BR>0010:80036090 00000000 00000000 00000000
00000000 ................<BR>0010:800360A0 A3480068 81008941 00000000
00000000 h.H.A...........<BR>0010:800360B0 00000000 00000000 00000000
00000000 ................<BR>0010:800360C0 00000000 00000000 00000000
00000000 ................<BR>0010:800360D0 00000000 00000000 00000000
00000000 ................<BR>0010:800360E0 0000FFFF F0009F45 0000FFFF
00009200 ....E...........<BR>0010:800360F0 DCE803B7 80009842 0000FFFF
00009200 ....B...........<BR>0010:80036100 0000FFFF F0409346 0000FFFF
F0409346 ....F.@.....F.@.<BR>0010:80036110 0000FFFF F0409346 80036120
00000000 ....F.@. a......<BR>0010:80036120 80036128 00000000 80036130
00000000 (a......0a......<BR>0010:80036130 80036138 00000000 80036140
00000000 8a......@a......<BR>0010:80036140 80036148 00000000 80036150
00000000 Ha......Pa......<BR>0010:80036150 80036158 00000000 80036160
00000000 Xa......`a......<BR>0010:80036160 80036168 00000000 80036170
00000000 ha......pa......<BR>0010:80036170 80036178 00000000 80036180
00000000 xa.......a......<BR>0010:80036180 80036188 00000000 80036190
00000000 .a.......a......<BR>0010:80036190 80036198 00000000 800361A0
00000000 .a.......a......<BR>0010:800361A0 800361A8 00000000 800361B0
00000000 .a.......a......<BR>0010:800361B0 800361B8 00000000 800361C0
00000000 .a.......a......<BR>0010:800361C0 800361C8 00000000 800361D0
00000000 .a.......a......<BR>0010:800361D0 800361D8 00000000 800361E0
00000000 .a.......a......<BR>0010:800361E0 800361E8 00000000 800361F0
00000000 .a.......a......<BR>0010:800361F0 800361F8 00000000 80036200
00000000 .a.......b......<BR>0010:80036200 80036208 00000000 80036210
00000000 .b.......b......<BR>0010:80036210 80036218 00000000 80036220
00000000 .b...... b......<BR>0010:80036220 80036228 00000000 80036230
00000000 (b......0b......<BR>0010:80036230 80036238 00000000 80036240
00000000 8b......@b......<BR>0010:80036240 80036248 00000000 80036250
00000000 Hb......Pb......<BR>0010:80036250 80036258 00000000 80036260
00000000 Xb......`b......<BR>0010:80036260 80036268 00000000 80036270
00000000 hb......pb......<BR>0010:80036270 80036278 00000000 80036280
00000000 xb.......b......<BR>0010:80036280 80036288 00000000 80036290
00000000 .b.......b......<BR>0010:80036290 80036298 00000000 800362A0
00000000 .b.......b......<BR>0010:800362A0 800362A8 00000000 800362B0
00000000 .b.......b......<BR>0010:800362B0 800362B8 00000000 800362C0
00000000 .b.......b......<BR>0010:800362C0 800362C8 00000000 800362D0
00000000 .b.......b......<BR>0010:800362D0 800362D8 00000000 800362E0
00000000 .b.......b......<BR>0010:800362E0 800362E8 00000000 800362F0
00000000 .b.......b......<BR>0010:800362F0 800362F8 00000000 80036300
00000000 .b.......c......<BR>0010:80036300 80036308 00000000 80036310
00000000 .c.......c......<BR>0010:80036310 80036318 00000000 80036320
00000000 .c...... c......<BR>0010:80036320 80036328 00000000 80036330
00000000 (c......0c......<BR>0010:80036330 80036338 00000000 80036340
00000000 8c......@c......<BR>0010:80036340 80036348 00000000 80036350
00000000 Hc......Pc......<BR>0010:80036350 80036358 00000000 80036360
00000000 Xc......`c......<BR>0010:80036360 80036368 00000000 80036370
00000000 hc......pc......<BR>0010:80036370 80036378 00000000 80036380
00000000 xc.......c......<BR>0010:80036380 80036388 00000000 80036390
00000000 .c.......c......<BR>0010:80036390 80036398 00000000 800363A0
00000000 .c.......c......<BR>0010:800363A0 800363A8 00000000 800363B0
00000000 .c.......c......<BR>0010:800363B0 800363B8 00000000 800363C0
00000000 .c.......c......<BR>0010:800363C0 800363C8 00000000 800363D0
00000000 .c.......c......<BR>0010:800363D0 800363D8 00000000 800363E0
00000000 .c.......c......<BR>0010:800363E0 800363E8 00000000 800363F0
00000000 .c.......c......<BR>0010:800363F0 800363F8 00000000 00000000
00000000 .c..............<BR><BR>我们来分析一下:<BR><BR>对于ring3,CS=001B DS=0023
ES=0023 SS=0023 FS=0038 GS=0000,<BR>DS,ES,SS,指向同一个段。<BR>001B=0000000000011
0 11<BR>0023=0000000000100 0 11<BR>所以根据前面段选择符的定义,表示 CS,DS,ES,SS
都是在全局描述符表中进行选择。<BR>选择符的特权级都是3(ring3)。对于CS,索引为3,由于每个描述符为8个字节,描述符相对于GDT开始处的地址为0x3*0x8=0x18。对于,DS,ES,SS,索引为4,描述符相对于GDT开始处的地址为0x4*0x8=0x20。<BR><BR>根据前面段描述符的定义,分析
80036018 开始的8个字节,和 80036020 开始的8个字节。<BR>0010:80036010 0000FFFF 00CF9300
0000FFFF 00CFFB00 ................<BR>0010:80036020 0000FFFF 00CFF300
400020AB 80008B1F ......... .@....<BR>可以得出<BR>Sel. Type Base Limit DPL
Attributes<BR>001B Code32 00000000 FFFFFFFF 3 P RE<BR>0023 Data32 00000000
FFFFFFFF 3 P RW<BR>可以看到,CS
对应的全局描述符表中的段描述符,是一个代码段,段基址为0,段界限为4G,DPL为3(ring3)。DS,ES,SS
对应的全局描述符表中的段描述符,是一个数据段,段基址为0,段界限为4G,DPL为3(ring3)。<BR><BR>对于ring0, cs=0008
ss=0010 ds=0023 es=0023 fs=0030 gs=0000,<BR>0008=0000000000001 0
00<BR>0010=0000000000010 0 00<BR>0023=0000000000100 0 11<BR>Sel. Type Base
Limit DPL Attributes<BR>0008 Code32 00000000 FFFFFFFF 0 P RE<BR>0010
Data32 00000000 FFFFFFFF 0 P RW<BR>0023 Data32 00000000 FFFFFFFF 3 P
RW<BR>可以看到,代码段和堆栈段的DPL为0(ring0)。三个描述符的段基址都为0,段界限都为4G。<BR><BR>CS,DS,ES,SS,这些段都完全重叠了,而且都是当前的4G地址空间。和段的另外一种使用方法(不同的段在不同的一块地址空间)相比,现在的使用方法,整个地址空间是连续的,平坦的,所以叫做平坦模式(Flat
Model)。<BR><BR>关于段寄存器(CS,DS,SS,ES,FS,GS),不可能每次参考一个段的时候CPU都去从内存中取出段描述符然后再做相应的处理,每个段寄存器还有看不到的部分,他们中存储着相应的段描述符中的信息。<BR><BR>全局描述表中的第一项不被使用,设为了"null
descriptor" 。<BR>0010:80036000 00000000
00000000<BR>用来初始化没有被使用的段寄存器,以防止如果被不小心使用一个没有被使用的段寄存器,对系统造成不良影响。Win2k中,段寄存器GS就没有被使用,值都设为了0。<BR><BR>前面分析了
CS,DS,ES,SS 。对于 GS 来说,我们可以看到它的值总是为0,Win2k 并没有使用它。而对于 FS 来说,对于使用平坦模式的 Win2k
来说,它是一个例外,在其他地方会对 FS 做更多的介绍。<BR><BR>在 ntddk.h
中的以下内容,也说明了上面的一些分析。<BR>#define KGDT_NULL 0<BR>#define KGDT_R0_CODE
8<BR>#define KGDT_R0_DATA 16<BR>#define KGDT_R3_CODE 24<BR>#define
KGDT_R3_DATA 32<BR>#define KGDT_TSS 40<BR>#define KGDT_R0_PCR
48<BR>#define KGDT_R3_TEB 56<BR>#define KGDT_VDM_TILE 64<BR>#define
KGDT_LDT 72<BR>#define KGDT_DF_TSS 80<BR>#define KGDT_NMI_TSS
88<BR><BR>线性地址(linear
address),把32bit可寻址的4G地址空间看做连续的线性地址空间,线性地址空间中的地址叫线性地址。逻辑地址(logical
address),逻辑地址由一个段选择符(16位)和一个段内偏移(32位)组成。也经常被叫做远程指针(far pointer)。x86 CPU
总是使用分段机制的(即使是使用了最少的分段机制的平坦模型),因此 x86 CPU
指令中的地址也总是逻辑地址,是相对于某一个段而言的地址。在保护模式下,x86 CPU
首先把逻辑地址转换成线性地址,然后再把线性地址转换成物理地址。<BR><BR>对于Win2k来说,由于使用了平坦模型,虚拟地址XXXXXXXX
和线性地址XXXXXXXX 指的是同一个地方。而平坦模型下,CS,DS,SS
这几个段的段基址为0,段界限为4G,就是整个地址空间,所以逻辑地址中的段内偏移的值就等于该逻辑地址转换成线性地址以后的值。<BR><BR>保护模式下的
x86 CPU
有4个特权级,从0到3。被叫做ring0,ring1,ring2,ring3。ring0权限最大,ring3权限最小。对于Win2k来说,只使用了ring0,ring3两个特权级。用户应用程序运行在ring3,系统内核运行在ring0。<BR>
Win2k中进程的地址空间,被分为用户地址空间和系统地址空间。用户模式下的程序将不能访问系统地址空间,这就是通过保护机制实现的。页目录项和页表项的
bit2
,Owner标志位表明了访问所需的特权级,为0表示访问需要ring0的特权级,为1表示ring3的特权级就可以访问。在发生内存访问时,CPU会把虚拟地址转换成物理地址。转换过程中,在从页目录项和页表项中获得物理地址的同时,会检查页目录项和页表项中的Owner标志位和当前的特权级,如果没有足够的特权级将会产生一个
page-fault 异常。注意权限的检测和地址的转换是同时由硬件进行的,不会为此损失额外的性能。当前特权级(CPL,Current
privilege level),当前执行程序的特权级,由CS,SS段寄存器中的最低2位指明。</FONT></P>
<P><FONT face=宋体>保护模式下的 x86 CPU 提供了很多的保护机制,这也就是为什么叫保护模式,更多内容可以参考
Intel手册。<BR><BR><B>未来</B></FONT>
<P>
呃,从某种意义上来说,我认为未来是可以预知的。就像天气预报所作的,在今天就知道明天或者后天将要发生的事情。当然,实际上我认为对于人类来说未来是不可预知的,人类所能知道的事情太有限了。呃,如果要估计我们现在讨论的分页机制还能在内存中活几年,就得估计CPU的发展,可能的新的需求的出现,人们的创造力。挺费事,又没有预测以后一些人痛斥学校的愚昧的情景那么过瘾,所以我要说的未来不是关于分页的。我认为不久的将来人工智能和机器人将非常重要。当然,实际上我认为当有真正的人工智能出现的时候,人类很有可能也就完了。
<P>欢迎交流,欢迎交朋友,<BR>欢迎访问 <A
href="http://jiurl.yeah.net/">http://jiurl.yeah.net/</A> <A
href="http://jiurl.cosoft.org.cn/forum">http://jiurl.cosoft.org.cn/forum</A>
<P>
<P>
<P> </P></TD></TR></TBODY></TABLE></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -