原博客:http://www.cnblogs.com/lanrenxinxin/p/4735027.html

详细的理论讲解都在上面

下面说的是通过windbg手动进行寻址,深入理解

x64:

实践:

int main()
{
char* v1 = "HelloWorld";

printf("%p\r\n", v1);
while (1)
{

}

return 0;
}

PML4T(Page Map Level4 Table)及表内的PML4E结构,每个表为4K,内含512个PML4E结构,每个8字节
PDPT (Page Directory Pointer Table)及表内的PDPTE结构,每个表4K,内含512个PDPTE结构,每个8字节
 PDT (Page Directory Table)及表内的PDE结构,每个表4K,内含512个PDE结构,每个8字节
PT(Page Table)及表内额PTE结构,每个表4K,内含512个PTE结构,每个8字节。
每个table entry 的结构都是8个字节64位宽,而virtual address中每个索引值都是9位,因此每个table都是512x8= 4K字节。

虚拟地址对应的意义   (四级表)

0x376b30

对应二进制:                   000000000           000000001(9位)         1 0111 0110(9位)            1011 0011 0000(12位)

对应选择子(索引)           0                                1                                          176                                         b30

Windbg调试:

PROCESS 88713b58 SessionId: 1 Cid: 0724 Peb: 7ffde000 ParentCid: 056c
DirBase: 7f33c3c0 ObjectTable: 9a1d3cb8 HandleCount: 7.
Image: Helloworld.exe

kd> ! dq 7f33c3c0 
#7f33c3c0 00000000`36c1f801 00000000`36e20801
#7f33c3d0 00000000`370a1801 00000000`38122801
#7f33c3e0 00000000`0e343801 00000000`0e444801
#7f33c3f0 00000000`0dd45801 00000000`0e4c6801
#7f33c400 00000000`395ce801 00000000`3964f801
#7f33c410 00000000`7a350801 00000000`38d51801
#7f33c420 00000000`0e654801 00000000`0df55801
#7f33c430 00000000`0e356801 00000000`0e2d7801

kd> ! dq 36c1f000   
#36c1f000 00000000`3823e867 00000000`375bd867
#36c1f010 00000000`3794a867 00000000`00000000
#36c1f020 00000000`00000000 00000000`00000000
#36c1f030 00000000`00000000 00000000`00000000
#36c1f040 00000000`00000000 00000000`00000000
#36c1f050 00000000`00000000 00000000`00000000
#36c1f060 00000000`00000000 00000000`00000000
#36c1f070 00000000`00000000 00000000`00000000

kd> ! dq 375bd000+176*8
#375bdbb0 80000000`3e73a025 80000000`383ff025
#375bdbc0 80000000`382d0025 80000000`39078867
#375bdbd0 80000000`38e6f025 80000000`37b51025
#375bdbe0 80000000`3a53b025 80000000`3d4d4025
#375bdbf0 80000000`37602025 00000000`00000000
#375bdc00 00000000`00000000 00000000`00000000
#375bdc10 00000000`00000000 00000000`00000000
#375bdc20 00000000`00000000 00000000`00000000

kd> ! db 3e73a000+b30
#3e73ab30 48 65 6c 6c 6f 57 6f 72-6c 64 00 00 25 70 0d 0a HelloWorld..%p..
#3e73ab40 00 00 00 00 00 6c 37 00-10 6d 37 00 68 6e 37 00 .....l7..m7.hn7.
#3e73ab50 8c 6e 37 00 cc 6e 37 00-00 6f 37 00 01 00 00 00 .n7..n7..o7.....
#3e73ab60 00 00 00 00 01 00 00 00-01 00 00 00 01 00 00 00 ................
#3e73ab70 01 00 00 00 53 74 61 63-6b 20 61 72 6f 75 6e 64 ....Stack around
#3e73ab80 20 74 68 65 20 76 61 72-69 61 62 6c 65 20 27 00 the variable '.
#3e73ab90 27 20 77 61 73 20 63 6f-72 72 75 70 74 65 64 2e ' was corrupted.
#3e73aba0 00 00 00 00 54 68 65 20-76 61 72 69 61 62 6c 65 ....The variable

找到HelloWorld

相关博客:

http://www.360doc.com/content/14/1127/10/1895599_428416943.shtml

《x86/x64体系编程》

《软件调试》

x64 分页机制——虚拟地址到物理地址寻址的更多相关文章

  1. x86 分页机制——虚拟地址到物理地址寻址

    x86下的分页机制有一个特点:PAE模式 PAE模式 物理地址扩展,是基于x86 的服务器的一种功能,它使运行 Windows Server 2003, Enterprise Edition 和 Wi ...

  2. X64下的虚拟地址到物理地址的转换

    https://bbs.pediy.com/thread-203391.htm   早就知道传上来排版会全乱掉,把pdf直接传上来吧 x64结构体系寻址.pdf 发现安大的关于x86启用PAE下的虚拟 ...

  3. Linux内存寻址之分页机制

    在上一篇文章Linux内存寻址之分段机制中,我们了解逻辑地址通过分段机制转换为线性地址的过程.下面,我们就来看看更加重要和复杂的分页机制. 分页机制在段机制之后进行,以完成线性—物理地址的转换过程.段 ...

  4. Linux内存寻址之分段机制及分页机制【转】

    前言 本文涉及的硬件平台是X86,如果是其他平台的话,如ARM,是会使用到MMU,但是没有使用到分段机制: 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为 ...

  5. linux x86内核中的分页机制

    Linux采用了通用的四级分页机制,所谓通用就是指Linux使用这种分页机制管理所有架构的分页模型,即便某些架构并不支持四级分页.对于常见的x86架构,如果系统是32位,二级分页模型就可满足系统需求: ...

  6. Linux分页机制之分页机制的实现详解--Linux内存管理(八)

    1 linux的分页机制 1.1 四级分页机制 前面我们提到Linux内核仅使用了较少的分段机制,但是却对分页机制的依赖性很强,其使用一种适合32位和64位结构的通用分页模型,该模型使用四级分页机制, ...

  7. Linux分页机制之分页机制的演变--Linux内存管理(七)

    1 页式管理 1.1 分段机制存在的问题 分段,是指将程序所需要的内存空间大小的虚拟空间,通过映射机制映射到某个物理地址空间(映射的操作由硬件完成).分段映射机制解决了之前操作系统存在的两个问题: 地 ...

  8. Linux分页机制之概述--Linux内存管理(六)

    1 分页机制 在虚拟内存中,页表是个映射表的概念, 即从进程能理解的线性地址(linear address)映射到存储器上的物理地址(phisical address). 很显然,这个页表是需要常驻内 ...

  9. [转帖]Linux分页机制之分页机制的演变--Linux内存管理(七)

    Linux分页机制之分页机制的演变--Linux内存管理(七) 2016年09月01日 20:01:31 JeanCheng 阅读数:4543 https://blog.csdn.net/gatiem ...

随机推荐

  1. LightOJ - 1197 素数筛

    深夜无事可干啊 #include<bits/stdc++.h> using namespace std; const int maxn = 1e6+11; typedef long lon ...

  2. WAMP下Apache配置Vhost (2

    发布网站添加虚拟机"/usr/local/apache/conf/extra/httpd-vhost.conf"的最下面: <VirtualHost *:80> Ser ...

  3. Oracle分析函数系列之first_value/last_value:在记录集中查找第一条记录和最后一条记录

    [转自] http://blog.csdn.net/rfb0204421/article/details/7675911 注意:与max,min的区别,虽然也可以实现,但只是针对数字字段. 1.初始化 ...

  4. poj2393tmp

    #include"iostream" #include"stdio.h" #include"algorithm" using namespa ...

  5. PIE SDK临时元素的绘制

    1. 功能简介 在数据的处理中会用到临时元素的绘制,用于当前显示:临时元素包括点.线.面.文本.图片五种元素:目前PIE SDK支持这五种元素的绘制,下面对五种临时元素的绘制功能进行介绍. 2. 功能 ...

  6. win10 装centos7 虚拟机

    1.下载VMware Workstation 64版本 https://www.vmware.com/products/workstation-pro/workstation-pro-evaluati ...

  7. groovy——运行方式、基本语法、引入方式、metaClass

    jvm运行groovy类有两种方式: 1.使用groovyc编译所有的*.groovy为java的*.class文件,把这些*.class文件放在java类路径中,通过java类加载器来加载这些类. ...

  8. Centos 添加swap

    swap是linux系统的虚拟内存,物理内存不足时,会用到.生产环境,最好添加上,以防内存异常暴增时,系统出现问题. 查看系统是否有swap分区,执行如下命令,若Swap那一行都为0,则表示没有Swa ...

  9. Docker的镜像迁移

    [root@localhost ~]# mkdir /opt/soft/ [root@localhost ~]# docker save c3987965c15d > /opt/soft/pos ...

  10. Oracle 单实例数据库安装和real application clusters数据库安装的区别

    在想了解Oracle单实例数据可和RAC数据库前,请确保你已经知道了数据库和实例的关系,如果不了解,请参考Oracle 数据库实例和数据库. 单实例数据库模式 单实例模式下,一个数据库只能通过一个实例 ...