⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jiurl玩玩win2k内存篇 分页机制 (四).htm

📁 关于win2000核心编程的文章
💻 HTM
📖 第 1 页 / 共 3 页
字号:
      01674163<BR># 69cac20 01675163 01676163 01657163 01658163<BR># 69cac30 
      01659163 0165a163 0165b163 0165c163<BR># 69cac40 0165d163 0165e163 
      0165f163 016c0163<BR># 69cac50 01681163 01682163 01683163 01684163<BR># 
      69cac60 01685163 01686163 01687163 01688163<BR># 69cac70 01689163 0168a163 
      0168b163 0168c163<BR>// 该处的DWORD值为 069ca063<BR>// 前面看到 CR3 的值为 
      069ca000</FONT></P>
      <P><FONT face=宋体><B>一个进程的页目录和页表本身所需要的物理内存</B></FONT></P>
      <P><FONT face=宋体>&nbsp;&nbsp;&nbsp; 
      一个进程需要物理页来放页表和页目录,如果有1024个页表,那么不是需要1024*4K=4M 的物理内存吗?一个进程只是页表信息就需要4M 
      的物理内存吗?不过实际上,当页目录中的一项有效标志位(第0位,最低位)为0,那么该项对应的页表就不存在,就不需要占用一个物理页。在前面的页目录的例子中我们已经看到了用户地址空间中有多少个无效项(系统地址空间中的东西,基本上大家都一样)。也就是说实际上为了保存一个进程的页表用不了多少物理内存。<BR>&nbsp;&nbsp;&nbsp; 
      这也就是为什么要使用2级的地址转换。如果只使用一级,只用页表,那么每个进程1024个页表就必须都放在物理内存中,即每个进程需要4M物理内存来放页表,这个代价对目前来说是太大了。使用2级地址转换,多一个步骤,虽然转换速度会变慢一些,但是节省了物理内存,在速度与内存之间寻求了平衡。</FONT></P>
      <P><FONT face=宋体><B>页目录项的 Write 标志位</B><BR>&nbsp;&nbsp;&nbsp; 
      从前面页目录的例子中,可以看到页目录的标志 bits1-1 Write 
      ,总是为1。<BR>表明页表所在的物理页总是可写的。这是因为页表和页目录是由系统维护的,系统需要向其中写入东西。</FONT></P>
      <P><FONT face=宋体><B>保护模式,Flat Model,线性地址,逻辑地址,ring0,ring3</B></FONT></P>
      <P><FONT face=宋体>以下内容只针对x86</FONT></P>
      <P><FONT face=宋体>&nbsp;&nbsp;&nbsp; Win2k 运行在保护模式(Protected Mode 
      )下,是否运行在保护模式下,取决于PE(Protection Enable)标志位 (CR0 的 bit 0 
      )。为0表示实模式(Real-Address Mode)(当机器加电启动和重启的时候,x86 CPU 
      处于实模式下),为1表示保护模式。观察Win2k的CR0的bit0,值为1,表明运行在保护模式下。</FONT></P>
      <P><FONT face=宋体>&nbsp;&nbsp;&nbsp; 
      对于x86体系结构来说,分段机制是必须被使用的(分页机制是可选的,分段和分页可以同时使用,Win2k使用了分页机制)。比如CPU执行代码总是参考代码段。在保护模式下,段寄存器(CS,DS,SS,ES,FS,GS)中放着的是段选择符,用于在某个描述符表中寻找段描述符。</FONT></P>
      <P><FONT face=宋体>&nbsp;&nbsp;&nbsp; 保护模式下的分段机制,有多种使用模型,Win2k使用的是一种叫做 Flat 
      Model 
      (平坦模型)。就是通过把段基址设为0,段界限设为4G,这样每个段都是整个地址空间,这样就隐藏了分段机制。<BR><BR>全局描述符表<BR>全局描述符表(GDT,global 
      descriptor 
      table)用来存放描述符,整个系统只有一个。由GDTR(全局描述符表寄存器)指出所在位置和大小。由于GDTR中的界限部分为16位,所以全局描述符表最大可以为64KB,每个描述符占8个字节,所以全局描述符表中最多可以放8192个描述符。<BR><BR>段选择符(CS,DS,SS,ES,FS,GS中放的是段选择符)的格式定义如下(来自Intel手册):<BR>段选择符,长2个字节,16bit。<BR><BR>Index: 
      bit3-bit15 13位 在全局描述符表或者局部描述符表中的索引,可以索引8192个描述符<BR>TI flag: bit2 1位 
      TI,table indicator,指定描述符表。为0在全局描述符表(GDT)中选择,为1在 当前的局部描述符表(LDT)中选择<BR>RPL: 
      bit0-bit1 2位 
      选择符的特权级<BR><BR>全局描述符表寄存器(GDTR,48bit)格式定义如下(来自Intel手册):<BR><BR>Table Limit: 
      bit0-bit15 16位 指定描述符表的字节数。<BR>Base Address: bit16-bit47 32位 
      指定描述符表的基地址。是线性地址。<BR><BR>段描述符格式定义如下:<BR><BR>typedef struct _SEG_DESCRIPTOR 
      //size 8 bytes<BR>{<BR>unsigned short limit_0_15;<BR>unsigned short 
      base_0_15;<BR>unsigned char base_16_23;<BR><BR>unsigned char accessed : 
      1;<BR>unsigned char r_w_e : 1;<BR>unsigned char e_c : 1;<BR>unsigned char 
      code_data : 1;<BR>unsigned char app_system : 1;<BR>unsigned char dpl : 
      2;<BR>unsigned char present : 1;<BR><BR>unsigned char limit_16_19 : 
      4;<BR>unsigned char unused : 1;<BR>unsigned char always_0 : 1;<BR>unsigned 
      char seg_16_32 : 1;<BR>unsigned char granularity : 1;<BR><BR>unsigned char 
      base_24_31;<BR>} SEG_DESCRIPTOR 
      ,*PSEG_DESCRIPTOR;<BR><BR>limit_0_15,limit_16_19,granularity<BR>段界限,两部分,共20bit。<BR>如果granularity位为0,段界限的值以字节为单位。段最大为1MB。<BR>如果granularity位为1,段界限的值以4KB为单位。段最大为4GB。<BR><BR>base_0_15,base_16_23,base_24_31<BR>段基址,三部分,共32bit。<BR><BR>accessed,readable,conforming,code_data<BR>accessed表示是否已经被访问过了。<BR>code_data为0表示代码段,为1表示数据段。<BR>对于数据段,r_w_e位表示是否可写,为0只读,为1可写。e_c位表示增长方向,为1向下增长。<BR>对于代码段,r_w_e位表示是否可读,为0只执行,为1可读。e_c位表示conforming或者nonconforming。<BR><BR>app_system<BR>0 
      = system, 1 = code or 
      data。为1时,表明是代码段或者数据段。为0时表明是系统段,系统段一些位的含义和数据段或者代码段不同。有以下几种系统段:16-Bit TSS 
      (Available),LDT,16-Bit TSS (Busy),16-Bit Call Gate,Task Gate,16-Bit 
      Interrupt Gate,16-Bit Trap Gate,32-Bit TSS (Available),32-Bit TSS 
      (Busy),32-Bit Call Gate,32-Bit Interrupt Gate,32-Bit Trap Gate。更多内容可以参考 
      Intel 
      手册。<BR><BR>dpl<BR>指定段的特权级。<BR><BR>present<BR>段是否在内存中<BR><BR>seg_16_32<BR>段是16位还是32位。<BR><BR><BR>下面看Win2k中实际的用法<BR><BR>一个ring3程序的段寄存器<BR>(使用VC调试器获得,也可以自己写程序获得,也可以用SoftICE断到一个ring3程序中获得...)<BR>CS 
      = 001B DS = 0023 ES = 0023 SS = 0023 FS = 0038 GS = 
      0000<BR><BR>一个ring0程序的段寄存器<BR>(使用KD获得,也可以写驱动程序获得,也可以用SoftICE断到一个ring0程序中获得...)<BR>cs=0008 
      ss=0010 ds=0023 es=0023 fs=0030 
      gs=0000<BR><BR>GDTR的内容可以由指令sgdt得到(sgdt不是特权指令,ring3也可以执行)。<BR>下面的内容来自SoftICE:<BR>:gdt<BR>Sel. 
      Type Base Limit DPL Attributes<BR>GDTbase=80036000 Limit=03FF<BR>// 
      GDTbase=80036000 Limit=03FF ,可以使用 sgdt指令做验证<BR>// 
      16bit的界限值为03FF,表明Win2k中GDT只有1K,可以存放128个描述符<BR><BR>0008 Code32 00000000 
      FFFFFFFF 0 P RE<BR>0010 Data32 00000000 FFFFFFFF 0 P RW<BR>001B Code32 
      00000000 FFFFFFFF 3 P RE<BR>0023 Data32 00000000 FFFFFFFF 3 P RW<BR>0028 
      TSS32 801F4000 000020AB 0 P B<BR>0030 Data32 FFDFF000 00001FFF 0 P 
      RW<BR>003B Data32 00000000 00000FFF 3 P RW<BR>0043 Data16 00000400 
      0000FFFF 3 P RW<BR>0048 Reserved 00000000 00000000 0 NP<BR>0050 TSS32 
      80470040 00000068 0 P<BR>0058 TSS32 804700A8 00000068 0 P<BR>0060 Data16 
      00022AB0 0000FFFF 0 P RW<BR>0068 Data16 000B8000 00003FFF 0 P RW<BR>0070 
      Data16 FFFF7000 000003FF 0 P RW<BR>0078 Code16 80400000 0000FFFF 0 P 
      RE<BR>0080 Data16 80400000 0000FFFF 0 P RW<BR>0088 Data16 00000000 
      00000000 0 P RW<BR>0090 Reserved 00000000 00000000 0 NP<BR>0098 Reserved 
      00000000 00000000 0 NP<BR>00A0 TSS32 8141A348 00000068 0 P<BR>00A8 
      Reserved 00000000 00000000 0 NP<BR>00B0 Reserved 00000000 00000000 0 
      NP<BR>00B8 Reserved 00000000 00000000 0 NP<BR>00C0 Reserved 00000000 
      00000000 0 NP<BR>00C8 Reserved 00000000 00000000 0 NP<BR>00D0 Reserved 
      00000000 00000000 0 NP<BR>00D8 Reserved 00000000 00000000 0 NP<BR>00E0 
      Code16 F0450000 0000FFFF 0 P RE ED<BR>00E8 Data16 00000000 0000FFFF 0 P 
      RW<BR>00F0 Code16 8042DCE8 000003B7 0 P EO<BR>00F8 Data16 00000000 
      0000FFFF 0 P RW<BR>0100 Data32 F0460000 0000FFFF 0 P RW<BR>0108 Data32 
      F0460000 0000FFFF 0 P RW<BR>0110 Data32 F0460000 0000FFFF 0 P RW<BR>0118 
      Reserved 00008003 00006120 0 NP<BR>0120 Reserved 00008003 00006128 0 
      NP<BR>0128 Reserved 00008003 00006130 0 NP<BR>0130 Reserved 00008003 
      00006138 0 NP<BR>0138 Reserved 00008003 00006140 0 NP<BR>0140 Reserved 
      00008003 00006148 0 NP<BR>0148 Reserved 00008003 00006150 0 NP<BR>0150 
      Reserved 00008003 00006158 0 NP<BR>0158 Reserved 00008003 00006160 0 
      NP<BR>0160 Reserved 00008003 00006168 0 NP<BR>0168 Reserved 00008003 
      00006170 0 NP<BR>0170 Reserved 00008003 00006178 0 NP<BR>0178 Reserved 
      00008003 00006180 0 NP<BR>0180 Reserved 00008003 00006188 0 NP<BR>0188 
      Reserved 00008003 00006190 0 NP<BR>0190 Reserved 00008003 00006198 0 
      NP<BR>0198 Reserved 00008003 000061A0 0 NP<BR>01A0 Reserved 00008003 
      000061A8 0 NP<BR>01A8 Reserved 00008003 000061B0 0 NP<BR>01B0 Reserved 
      00008003 000061B8 0 NP<BR>01B8 Reserved 00008003 000061C0 0 NP<BR>01C0 
      Reserved 00008003 000061C8 0 NP<BR>01C8 Reserved 00008003 000061D0 0 
      NP<BR>01D0 Reserved 00008003 000061D8 0 NP<BR>01D8 Reserved 00008003 
      000061E0 0 NP<BR>01E0 Reserved 00008003 000061E8 0 NP<BR>01E8 Reserved 
      00008003 000061F0 0 NP<BR>01F0 Reserved 00008003 000061F8 0 NP<BR>01F8 
      Reserved 00008003 00006200 0 NP<BR>0200 Reserved 00008003 00006208 0 
      NP<BR>0208 Reserved 00008003 00006210 0 NP<BR>0210 Reserved 00008003 
      00006218 0 NP<BR>0218 Reserved 00008003 00006220 0 NP<BR>0220 Reserved 
      00008003 00006228 0 NP<BR>0228 Reserved 00008003 00006230 0 NP<BR>0230 
      Reserved 00008003 00006238 0 NP<BR>0238 Reserved 00008003 00006240 0 
      NP<BR>0240 Reserved 00008003 00006248 0 NP<BR>0248 Reserved 00008003 
      00006250 0 NP<BR>0250 Reserved 00008003 00006258 0 NP<BR>0258 Reserved 
      00008003 00006260 0 NP<BR>0260 Reserved 00008003 00006268 0 NP<BR>0268 
      Reserved 00008003 00006270 0 NP<BR>0270 Reserved 00008003 00006278 0 
      NP<BR>0278 Reserved 00008003 00006280 0 NP<BR>0280 Reserved 00008003 
      00006288 0 NP<BR>0288 Reserved 00008003 00006290 0 NP<BR>0290 Reserved 
      00008003 00006298 0 NP<BR>0298 Reserved 00008003 000062A0 0 NP<BR>02A0 
      Reserved 00008003 000062A8 0 NP<BR>02A8 Reserved 00008003 000062B0 0 
      NP<BR>02B0 Reserved 00008003 000062B8 0 NP<BR>02B8 Reserved 00008003 
      000062C0 0 NP<BR>02C0 Reserved 00008003 000062C8 0 NP<BR>02C8 Reserved 
      00008003 000062D0 0 NP<BR>02D0 Reserved 00008003 000062D8 0 NP<BR>02D8 
      Reserved 00008003 000062E0 0 NP<BR>02E0 Reserved 00008003 000062E8 0 
      NP<BR>02E8 Reserved 00008003 000062F0 0 NP<BR>02F0 Reserved 00008003 
      000062F8 0 NP<BR>02F8 Reserved 00008003 00006300 0 NP<BR>0300 Reserved 
      00008003 00006308 0 NP<BR>0308 Reserved 00008003 00006310 0 NP<BR>0310 
      Reserved 00008003 00006318 0 NP<BR>0318 Reserved 00008003 00006320 0 
      NP<BR>0320 Reserved 00008003 00006328 0 NP<BR>0328 Reserved 00008003 
      00006330 0 NP<BR>0330 Reserved 00008003 00006338 0 NP<BR>0338 Reserved 
      00008003 00006340 0 NP<BR>0340 Reserved 00008003 00006348 0 NP<BR>0348 
      Reserved 00008003 00006350 0 NP<BR>0350 Reserved 00008003 00006358 0 
      NP<BR>0358 Reserved 00008003 00006360 0 NP<BR>0360 Reserved 00008003 
      00006368 0 NP<BR>0368 Reserved 00008003 00006370 0 NP<BR>0370 Reserved 
      00008003 00006378 0 NP<BR>0378 Reserved 00008003 00006380 0 NP<BR>0380 
      Reserved 00008003 00006388 0 NP<BR>0388 Reserved 00008003 00006390 0 
      NP<BR>0390 Reserved 00008003 00006398 0 NP<BR>0398 Reserved 00008003 
      000063A0 0 NP<BR>03A0 Reserved 00008003 000063A8 0 NP<BR>03A8 Reserved 
      00008003 000063B0 0 NP<BR>03B0 Reserved 00008003 000063B8 0 NP<BR>03B8 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -