登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

BlackGold的博客

 
 
 

日志

 
 
 
 

通过windbg查看虚拟地址到物理地址的映射过程  

2009-09-22 21:47:10|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在80386的CPU中,已经支持分页机制.通过分页机制,每个进程就可以独享4G的地址空间了。下面看看
分页机制中的几个概念。
1、页目录
是用来存放页目录项(PDE)的表。每个页目录大小为4K,可存放1024个PDE。页目录中存放的是页表
的地址。
对于内存页大小为4KB的页目录地址,只有高20Bit有用,其低12bit固定为0
对于内存页大小为4MB的页目录地址,只有高10Bit有用,其低22bit固定为0
2、页表
是用来存放页表项(PTE)的表。每个页表大小为4K,可存放1024个PTE。页表中存放的是一个内存页
的地址。
3、线性地址到物理地址的转换
对于我们程序中的一个线性地址,cpu是如何把它转到到物理地址的?
一个32位的线性地址,分为3部分:
PDE:    22 - 31 位
PTE:    12 - 21 位
OFFSET: 0  - 11 位
CPU会首先通过CR3寄存器找到PDE的基地址PDEBase,然后通过PDE找到PTE的地址:
PTEAddress = PDEBase[PDE];
通过PTEAddress就可以找到某一个内存也的地址:
PAGEAddress = PTEAddress[PTE];
要访问的物理地址就是 PAGEAddress+OFFSET;
还是来看看下面程序:
#include "stdafx.h"
char *hello = "ABCDEFG";
int main(int argc, char* argv[])
{
 printf("%x - %s\n", &hello, hello);
 getchar();
 return 0;
}
程序编译运行后显示:
422d14 - ABCDEFG
hello指针的地址是:0x422d14.
启动windbg,附加到该进程,输入命令:
0:001> dd 422d14
00422d14  0042001c c0000005 0000000b 00000000
00422d24  c000001d 00000004 00000000 c0000096
00422d34  00000004 00000000 c000008d 00000008
00422d44  00000000 c000008e 00000008 00000000
00422d54  c000008f 00000008 00000000 c0000090
00422d64  00000008 00000000 c0000091 00000008
00422d74  00000000 c0000092 00000008 00000000
00422d84  c0000093 00000008 00000000 00000003
字符串”ABCDEFG“的地址是:0x0042001c.
0:001> db 0042001c
0042001c  41 42 43 44 45 46 47 00-00 00 00 00 00 00 00 00  ABCDEFG.........
0042002c  5f 66 69 6c 62 75 66 2e-63 00 00 00 73 74 72 20  _filbuf.c...str
0042003c  21 3d 20 4e 55 4c 4c 00-5f 66 69 6c 65 2e 63 00  != NULL._file.c.
0042004c  70 72 69 6e 74 66 2e 63-00 00 00 00 66 6f 72 6d  printf.c....form
0042005c  61 74 20 21 3d 20 4e 55-4c 4c 00 00 69 33 38 36  at != NULL..i386
0042006c  5c 63 68 6b 65 73 70 2e-63 00 00 00 00 00 00 00  \chkesp.c.......
0042007c  54 68 65 20 76 61 6c 75-65 20 6f 66 20 45 53 50  The value of ESP
0042008c  20 77 61 73 20 6e 6f 74-20 70 72 6f 70 65 72 6c   was not properl
0:001>.formats 0042001c
Evaluate expression:
  Hex:     0042001c
  Decimal: 4325404
  Octal:   00020400034
  Binary:  00000000 01000010 00000000 00011100
  Chars:   .B..
  Time:    Fri Feb 20 09:30:04 1970
  Float:   low 6.06118e-039 high 0
  Double:  2.13703e-317

对于地址0x0042001c (0000000001 0000100000 000000011100),其
PDE = 1;
PTE = 0x20;
OFFSET = 0x1C;
用windbg启动一个本地的内核调试:
lkd> !process 0 0 testpte.exe
PROCESS 866c66a0  SessionId: 0  Cid: 008c    Peb: 7ffd8000  ParentCid: 0354
    DirBase: 21f8d000  ObjectTable: e2a2e3a0  HandleCount:   7.
    Image: TestPTE.exe
我们可以看到cr3寄存器的地址为:21f8d000.
lkd> !dd 21f8d000 
#21f8d000 22001067 21500067 00000000 00000000
#21f8d010 00000000 00000000 00000000 00000000
#21f8d020 00000000 00000000 00000000 00000000
#21f8d030 00000000 00000000 00000000 00000000
#21f8d040 00000000 00000000 00000000 00000000
#21f8d050 00000000 00000000 00000000 00000000
#21f8d060 00000000 00000000 00000000 00000000
#21f8d070 00000000 00000000 00000000 00000000
由于PDE = 1,可以得到PTE表的地址 = 21500000;
lkd> !dd 21500000 + 0x20*4
#21500080 1e062025 00000000 1c43c067 20fae067
#21500090 21706067 1ec99027 00000000 00000000
#215000a0 00000000 00000000 00000000 00000000
#215000b0 00000000 00000000 00000000 00000000
#215000c0 21974067 225b5067 21436067 207f7067
#215000d0 210f8067 1c6b9067 1e0ba067 1c2bb067
#215000e0 00000000 00000000 00000000 00000000
#215000f0 00000000 00000000 00000000 00000000
由于PTE = 0x20,可以得到某一页内存的基地址为:1e062000
加上偏移量0x1c,虚拟地址0x0042001c对应的物理地址为:0x1e06201c。
我们看到物理内存0x1e06201c中存放的数据和虚拟内存0x0042001c中存放的数据一致。
lkd> !db 1e06201c
#1e06201c 41 42 43 44 45 46 47 00-00 00 00 00 00 00 00 00 ABCDEFG.........
#1e06202c 5f 66 69 6c 62 75 66 2e-63 00 00 00 73 74 72 20 _filbuf.c...str
#1e06203c 21 3d 20 4e 55 4c 4c 00-5f 66 69 6c 65 2e 63 00 != NULL._file.c.
#1e06204c 70 72 69 6e 74 66 2e 63-00 00 00 00 66 6f 72 6d printf.c....form
#1e06205c 61 74 20 21 3d 20 4e 55-4c 4c 00 00 69 33 38 36 at != NULL..i386
#1e06206c 5c 63 68 6b 65 73 70 2e-63 00 00 00 00 00 00 00 \chkesp.c.......
#1e06207c 54 68 65 20 76 61 6c 75-65 20 6f 66 20 45 53 50 The value of ESP
#1e06208c 20 77 61 73 20 6e 6f 74-20 70 72 6f 70 65 72 6c  was not properl
  评论这张
 
阅读(1438)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018