kenli79
驱动小牛
驱动小牛
  • 注册日期2002-06-12
  • 最后登录2003-07-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1144回复:1

2000 内存的 地址转换机制

楼主#
更多 发布于:2003-02-25 10:20
地址转换机制

在进程中引用的地址都是虚拟地址,下面说明Windows 2000操作系统是怎样将虚拟地址映射到实际的物理地址.这里的说明只是针对于非PAE系统,在PAE系统下情况可能会稍有不同。

默认情况下Windows 2000采用两级页表结构来转换虚拟地址和物理地址。即页面目录和页表,页面目录项(PDE - page directory entry)用于查找页表,而页表项(PTE - page table entry)描述了虚拟地址所在页对应的物理地址(一个页表项有可能没有对应一个有效的物理内存页面,这样的一次内存访问会导致一个页面I/O,后面再说)。
一个虚拟地址为32位,高10位是页面目录项索引,接下来的10位为页表项索引,低位12位为页内字节索引。如下图:


EPROCESS          
   |      
   |       31         21          11        0
   |        --------------------------------
   |       页面目录索引|页面表索引 | 字节索引
   |           |            |           |
 --+-----------|     -------+           |
 | |    目录表       |   页表           |
 | ->-----------+  +-->+-------+        +---------
 |   |          |  | | |       |                 |
 |   |          |  | | |       |                 |
 |   |----------|  | | |       |       物理页面  |
 |-->|  PDE    -+--+ | +-------+  |-->+-------+  |
     |----------|    +>|  PTE -+---   |       |  |
     |          |      +-------+      +-------+  |
     |          |      |       |      | 数据  |<-+
     |----------|      ---------      +-------+

以下是一个虚拟地址的转换过程:

1。内存管理器从进程的变量中取出进程的页面目录地址,然后根据前十位的PDE索引取出页面表的地址。(X86的特殊寄存器CR3,是当前进程的页面目录的地址。在SOFTICE中使用reg命令无法看到,可以用cpu命令看。)

2。根据中间十位的页面表索引在页面表中找到PTE,PTE中有页面的当前状态,如果已经在物理内存中,就可以根据PTE中的PFN(PAGE FRAME NO.)找到物理页面。

3。根据字节索引在物理页面中找到要找的数据。


[编辑 -  2/25/03 by  kenli79]
超级菜鸟!!!!!!!!!
kenli79
驱动小牛
驱动小牛
  • 注册日期2002-06-12
  • 最后登录2003-07-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-02-25 10:31
我画的ascii图都显不好,郁闷。
随便写点,有兴趣的人讨论。
超级菜鸟!!!!!!!!!
游客

返回顶部