精华内容
下载资源
问答
  • 项目中经常需要把内存数据dump出来看看是否与自己设想的一样,dump之前我们需要把内核的虚拟地址转换为物理地址才能借助工具dump出来。废话不多说,直接说正题。1. 内核里的地址是从3G开始算的,即起始地址为:0xc...

    项目中经常需要把内存数据dump出来看看是否与自己设想的一样,dump之前我们需要把内核的虚拟地址先转换为物理地址才能借助工具dump出来。


    废话不多说,直接说正题。

    1. 内核里的地址是从3G开始算的,即起始地址为:0xc0000000

    2. ARM小机端的内存起始地址并不是0,而是0x40000000

    也就是说虚拟地址与物理内存起始地址两者的差为:0x80000000

    那如果要将内核的虚拟地址转换为物理地址,则为:物理地址 = 虚拟地址 - 0x80000000

    例如:虚拟地址:0xc09baf08  对应的物理内存地址应为:0x409baf08


    得出物理地址就可以通过工具抓取内存的真实数据了,这对于解决内核死机问题有极大的分析帮助作用。


    展开全文
  • 仿照书上的例子,试着手工把虚拟地址转换到物理地址。 由于书中的例子是针对未开启PAE的情况,而我的XP SP2默认开启了PAE,所以白白浪费了大半天时间。话说以前还真不知道启动参数里面/noexecute=optin也会开启PAE...

    正在逐章学习《调试软件》一书,看到2.7分页机制。仿照书上的例子,试着手工把虚拟地址转换到物理地址。

    由于书中的例子是针对未开启PAE的情况,而我的XP SP2默认开启了PAE,所以白白浪费了大半天时间。话说以前还真不知道启动参数里面/noexecute=optin也会开启PAE。

    后来在网上找到了作者针对开启PAE后如何转换的文章,重新实验了一下。原文地址:http://advdbg.org/blogs/advdbg_system/articles/627.aspx


    1、启动计算器,输入数字“234234”。


    2、启动WinDbg,附加到计算器进程。


    3、输入命令x calc!gp*,得到如下信息

    01014db0 calc!gpszNum = <no type information>


    4、输入命令dd 1014db0 l1,查看地址1014db0的内容,得到如下信息

    01014db0  000b4130


    5、输入命令du b4130,查看地址b4130的字符串信息,得到

    000b4130  "234234."

    显然计算器把输入的数字的字符信息保存在这个地址里。


    6、现在把这个地址000b4130分解一下,看清楚各个部分

    位30,31 页目录指针表索引(PDPE)0x0

    位21-29 页目录索引 (PDE)0x0

    位12-20 页表索引(PTE)0 1011 0100 = 0xb4

    位0-11 页内偏移 0001 0011 0000 = 0x130


    7、再启动一个WinDbg,进入本地内核调试。


    8、输入命令!process 0 0 列出所有进程,找到计算器对应的进程信息。

    PROCESS 88269020  SessionId: 0  Cid: 0158    Peb: 7ffde000  ParentCid: 01e0
        DirBase: 0ef40120  ObjectTable: e2c3f7f0  HandleCount:  49.
        Image: calc.exe


    9、DirBase就是该进程的页目录指针表的基地址,由于PDPE为0,所以地址ef40120中就是页目录的基地址信息。

    输入命令!dd ef40120 l2,查看其中的内容,得到信息

    # ef40120 33e45001 00000000

    取12-35位,低12位为0(按4KB对齐),得到 0x33e45000。


    10、同样由于PDE为0,所以地址33e45000就是页表的基地址信息。

    输入命令!dd 33e45000 l2,得到信息

    #33e45000 340a4067 00000000

    还是取12-35位,低12位为0(按4KB对齐),得到页表基地址0x34a4000。


    11、将页表基地址加上页表索引,得到页信息

    输入命令!dd 34a4000+b4*8 l2,得到信息

    #340a45a0 339df067 80000000

    这个就是页地址了。


    12、将页地址加上页内偏移,得到最终物理地址

    输入命令!du 339df000+130

    #339df130 "234234."

    这与上面的内容完全一致。


    另外WinDbg还提供了指令!vtop,能够直接将虚拟地址转换为物理地址。

    lkd> !vtop ef40120 b4130
    X86VtoP: Virt 000b4130, pagedir ef40120
    X86VtoP: PAE PDPE ef40120 - 0000000033e45001
    X86VtoP: PAE PDE 33e45000 - 00000000340a4067
    X86VtoP: PAE PTE 340a45a0 - 80000000339df067
    X86VtoP: PAE Mapped phys 339df130
    Virtual address b4130 translates to physical address 339df130.

    展开全文
  • 虚拟地址转换成物理地址

    千次阅读 2009-10-10 14:54:00
    有两个方法将一个虚拟地址转换成一个物理地址:使用 !vtop 扩展和使用 !pte 扩展。在Windows NT 4.0中还可以使用 !vpdd 扩展。使用 !vtop 进行地址转换假设你正在调试一台正在运行MyApp.exe进程的目标计算机,而且你...

    大多数调试器命令的输入参数和输出结果使用虚拟地址,而不使用物理地址。不过,有时候可能用得上物理地址。

    有两个方法将一个虚拟地址转换成一个物理地址:使用 !vtop 扩展和使用 !pte 扩展。在Windows NT 4.0中还可以使用 !vpdd 扩展。

    使用 !vtop 进行地址转换
    假设你正在调试一台正在运行MyApp.exe进程的目标计算机,而且你想要调查虚拟地址0x0012F980。使用 !vtop 扩展确定对应的物理地址,步骤如下。

    使用 !vtop 将虚拟地址转换成物理地址
    确保你是工作在十六进制中。如若不然,用 N 16 命令设定当前基数。
    确定地址的字节索引byte index。这个数值等于虚拟地址的最低12位。因此,虚拟地址 0x0012F980 的字节索引是0x980。
    使用 !process 扩展来确定该地址的目录基址directory base:
    kd> !process 0 0
    **** NT ACTIVE PROCESS DUMP ****
    ....
    PROCESS ff779190  SessionId: 0  Cid: 04fc    Peb: 7ffdf000  ParentCid: 0394
        DirBase: 098fd000  ObjectTable: e1646b30  TableSize:   8.
        Image: MyApp.exe

    确定目录基址的页框架号page frame number。只须把目录基址去掉尾部三个十六进制零就是了。本例中,目录基址是 0x098FD000 ,因此页框架号是 0x098FD。
    使用 !vtop 扩展。这个扩展的第一个参数应该是页框架号。 !vtop 的第二个参数应该是正被讨论的虚拟地址:
    kd> !vtop 98fd 12f980
    Pdi 0 Pti 12f
    0012f980 09de9000 pfn(09de9)

    最后一行显示的第二个数值是物理页开始的物理地址。

    把字节索引加上页的开始地址:0x09DE9000 + 0x980 = 0x09DE9980。即是所求的物理地址。

    你能够通过显示每个地址的内存来验证这个计算结果是正确的。!d* 扩展显示一个指定物理地址上的内存:

    kd> !dc 9de9980
    # 9de9980 6d206e49 726f6d65 00120079 0012f9f4 In memory.......
    # 9de9990 0012f9f8 77e57119 77e8e618 ffffffff .....q.w...w....
    # 9de99a0 77e727e0 77f6f13e 77f747e0 ffffffff .'.w>..w.G.w....
    # 9de99b0 .....

    d* (显示内存) 命令以一个虚拟地址作为它的参数:

    kd> dc 12f980
    0012f980  6d206e49 726f6d65 00120079 0012f9f4  In memory.......
    0012f990  0012f9f8 77e57119 77e8e618 ffffffff  .....q.w...w....
    0012f9a0  77e727e0 77f6f13e 77f747e0 ffffffff  .'.w>..w.G.w....
    0012f9b0  .....

    结果是相同的,所以这表明物理地址 0x09DE9980 的确对应虚拟地址 0x0012F980。

    使用 !pte 进行地址转换
    再次假定你正在调查属于MyApp.exe进程的虚拟地址0x0012F980。使用 !pte 扩展确定对应的物理地址,步骤如下:

    使用 !pte 将虚拟地址转换成物理地址
    确保你是工作在十六进制中。如若不然,用 N 16 命令设定当前基数。
    确定地址的byte index。这个数值等于虚拟地址的最低12位。因此,虚拟地址0x0012F980的字节索引是0x980。
    把需要的进程设定为进程上下文环境process context:
    kd> !process 0 0
    **** NT ACTIVE PROCESS DUMP ****
    ....
    PROCESS ff779190  SessionId: 0  Cid: 04fc    Peb: 7ffdf000  ParentCid: 0394
        DirBase: 098fd000  ObjectTable: e1646b30  TableSize:   8.
        Image: MyApp.exe

    kd> .process /p ff779190
    Implicit process is now ff779190
    .cache forcedecodeuser done

    以虚拟地址作为参数使用 !pte 扩展。显示两个栏的信息。左栏描述这个地址的页目录项(PDE),右栏描述它的页表项(PTE):
    kd> !pte 12f980
                   VA 0012f980
    PDE at   C0300000        PTE at C00004BC
    contains 0BA58067      contains 09DE9067
    pfn ba58 ---DA--UWV    pfn 9de9 ---DA--UWV

    在右栏最后一列看到记号“pfn 9de9”出现。数值0x9DE9是这个PTE的page frame number (PFN)。把页框架号乘以0x1000 (例如,把它左移12位)。所得乘积0x09DE9000是页开始的物理地址。
    把字节索引加上页开始的地址:0x09DE9000 + 0x980 = 0x09DE9980。即是所求的物理地址。

    这与前一个方法获得的结果相同。

    手动转换地址
    虽然 !ptov 和 pte 扩展提供最快速的方法将虚拟地址转换成物理地址,但我们也可以手动做这个转换。对这一过程的描述会让你搞清楚虚拟存储结构的某些细节。

    存储结构因处理器和硬件配置而有不同大小。这里以一个不启用物理地址扩展(PAE)的x86系统为例。

    还是用0x0012F980作为虚拟地址,首先你需要将它转换成二进制,手动或使用 .formats (显示格式化数值) 命令均可:

    kd> .formats 12f980
    Evaluate expression:
      Hex:     0012f980
      Decimal: 1243520
      Octal:   00004574600
      Binary:  00000000 00010010 11111001 10000000
      Chars:   ....
      Time:    Thu Jan 15 01:25:20 1970
      Float:   low 1.74254e-039 high 0
      Double:  6.14381e-318

    这个虚拟地址是三个域的组合。位 0 到 11 是字节索引。位 12 到 21 是页表索引。位 22 到 31 是页目录索引。分开这些域,得:

    0x0012F980  =  0y  00000000 00   010010 1111   1001 10000000

    这展现该虚拟地址的三个部份:

    页目录索引 = 0y0000000000 = 0x0
    页表索引 = 0y0100101111 = 0x12F
    字节索引 = 0y100110000000 = 0x980

    然后你需要关于你的系统的另外三个的信息。

    每个PTE的尺寸。在非PAE的x86系统上它是4个字节。
    页尺寸。它是0x1000个字节。
    PTE_BASE虚拟地址。在一个非PAE系统上,它是0xC0000000。

    使用这数据,你能够计算PTE本身的地址:

    PTE address   =   PTE_BASE  
                    + (page directory index) * PAGE_SIZE
                    + (page table index) * sizeof(MMPTE)
                  =   0xc0000000
                    + 0x0   * 0x1000
                    + 0x12F * 4
                  =   0xC00004BC

    这是PTE的地址。PTE是个32位双字节DWORD。调查它的内容:

    kd> dd 0xc00004bc L1
    c00004bc  09de9067

    这个PTE的值是0x09DE9067。它由两个域组成:

    该PTE的低12位是状态标记status flags。这里,这些标记等于0x067 - 或者用二进制表示为0y000001100111。关于状态标记的说明,请看 !pte 参考页。
    该PTE的高20位等于该PTE的page frame number (PFN)。这里,该PFN是0x09DE9。

    该物理页上的第一个物理地址是该PFN乘以0x1000 (左移12位)。字节索引是在该页上的偏移量。因此,你所求的物理地址是0x09DE9000 + 0x980 = 0x09DE9980。这跟以上方法获得的结果相同。

    展开全文
  • 初试将虚拟地址转换为物理地址

    千次阅读 2013-06-16 17:40:17
    背景:最近学习张银奎的《软件调试》,看到 2.7.5 节 使用WinDBG观察分页机制,终于看到第一个可以操作的例子,但始终不能按书上的方式正确的将虚拟地址转换为物理地址,google一下,终于解决,放到这里记录一下。...

    背景:最近学习张银奎的《软件调试》,看到 2.7.5 节 使用WinDBG观察分页机制,终于看到第一个可以操作的例子,但始终不能按书上的方式正确的将虚拟地址转换为物理地址,google一下,终于解决,放到这里记录一下。

    注:可以看到提示符是:kd,这里为了避免开两个windbg,直接使用的是内核调试调试虚拟机里面的XP SP3:

    kd> vertarget
    Windows XP Kernel Version 2600 (Service Pack 3) UP Free x86 compatible
    Built by: 2600.xpsp_sp3_gdr.130307-0422
    Machine Name:
    Kernel base = 0x804d8000 PsLoadedModuleList = 0x80555140
    Debug session time: Sun Jun 16 16:03:10.609 2013 (UTC + 8:00)
    System Uptime: 0 days 0:03:49.906

    一、《软件调试》中使用的方式:

              1. 首先找到calc!gpszNum这个指针的值,(进程上下文设置部分省略)

    kd> x calc!gpsz*
    01014db0 calc!gpszNum = <no type information>
    kd> dd 01014db0 l1
    01014db0  000b55d0
    kd> du 000b55d0
    000b55d0  "123456778."
    kd> .formats 000b55d0
    Evaluate expression:
      Hex:     000b55d0
      Decimal: 742864
      Octal:   00002652720
      Binary:  00000000 00001011 01010101 11010000
      Chars:   ..U.
      Time:    Fri Jan 09 22:21:04 1970
      Float:   low 1.04097e-039 high 0
      Double:  3.67024e-318
    

    可以看到,虚拟地址000b55d0的也目录索引(高10位)为0;页表索引(中间10位)即0xB5;页内偏移为(低12位)为0x5D0。

             2. 找到calc进程的页目录基地址的物理地址:

    kd> !process 0 0 calc.exe
    PROCESS 81ad6020  SessionId: 0  Cid: 0890    Peb: 7ffda000  ParentCid: 06bc
        DirBase: 04940380  ObjectTable: e1bafd30  HandleCount:  45.
        Image: calc.exe
    kd> !dd 04940380  
    # 4940380 0aace001 00000000 0ab4f001 00000000
    # 4940390 06e50001 00000000 0ab8d001 00000000
    # 49403a0 f8da5420 00000000 1ed41001 00000000
    # 49403b0 1ecc2001 00000000 1ec3f001 00000000
    # 49403c0 f8da53a0 00000000 1e861001 00000000
    # 49403d0 1e7a2001 00000000 1e71f001 00000000
    # 49403e0 f8da53c0 00000000 05fec001 00000000
    # 49403f0 05a6d001 00000000 05cea001 00000000
    


    到这里,问题就出来了,首先DirBase地址似乎不对,书上、网上、windbg帮助文档上的都是低12位为0,而且在 8.2.11 页目录基址 也写到“DirBase代表的是该进程的页目录基地址,即切换到该进程时,CR3寄存器的内容。***因为页目录是按4KB边界对齐的,所以DirBase的低12位总是0。”,但这里为0x380?然后,该物理地址指向的内存值似乎也不对。

              3. 观察物理地址:

    kd> !dd 0aace000+b5*4
    # aace2d4 00000000 00000000 00000000 00000000
    # aace2e4 00000000 00000000 00000000 00000000
    # aace2f4 00000000 00000000 00000000 00000000
    # aace304 00000000 00000000 00000000 00000000
    # aace314 00000000 00000000 00000000 00000000
    # aace324 00000000 00000000 00000000 00000000
    # aace334 00000000 00000000 00000000 00000000
    # aace344 00000000 00000000 00000000 00000000

    明显不对了,物理地址是0x00 ?!

    现在知道是什么原因了:电脑启用了PAE(Physical Address Extension),在拥有PAE技术支持的CPU上运行的操作系统以及应用程序被规定继续沿用以前的32位虚拟地址,通过段式转换,仍然得到32位的线性地址。而打开PAE支持的页式管理系统则负责把32位的线性地址映射到64GB物理空间的任何位置。在PAE技术支持下,系统可以拥有两种大小的物理页面:传统的4KB和2MB页面(注意,不是4MB)。同时,采用PAE技术的页式地址转换与传统的IA32方式有了非常大的变化:首先,IA32中的两级页表在PAE中变成了三层,CR3指向的不再是页目录表,而被称为页目录指针表(Page Directory Pointer Table),它其实是个短表,只包含了4个指向页目录表的指针(在Linux的实现里,被称为中间页表PMD,Page Middle Directory),再由该页目录表指向可以选择的页表(也可以直接指向2MB的物理页面)。其次,虽然页目录表和页表仍然是4KB的大小,但是页目录项和页表项(PDE和PTE)从以前的32位变为了64位。同时,页目录表和页表所容纳的页目录项或页表项也从以前的1024个缩水到了512个。(摘自百度百科)。


    二、使用!pte转换

    最后没办法了,在网上搜索到了另一个方法:

    kd> !pte 000b55d0  
                        VA 000b55d0
    PDE at C0600000            PTE at C00005A8
    contains 000000000BE42067  contains 800000000A8AE067
    pfn be42      ---DA--UWEV   pfn a8ae      ---DA--UW-V
    
    
    kd> !dd a8ae5d0
    # a8ae5d0 00320031 00340033 00360035 00370037
    # a8ae5e0 002e0038 00000000 00040004 000c0198
    # a8ae5f0 00000000 00340033 00360035 00370037
    # a8ae600 0000002e 000a246a 00040153 00000010
    # a8ae610 000b4190 000a0178 00200001 000a246a
    # a8ae620 00000000 00000000 00000020 000a246a
    # a8ae630 00000000 00000010 00000010 00000002
    # a8ae640 00010001 000a246a 00000000 00000000
    kd> !du a8ae5d0
    # a8ae5d0 "123456778."

    在右栏最后一列看到记号“pfn a8ae”出现。数值0xA8AE是这个PTE的page frame number (PFN)。把页框架号乘以0x1000 (例如,把它左移12位)。所得乘积0x0A8AE000是页开始的物理地址。 
    把字节索引加上页开始的地址:0x0A8AE000 + 0x5DO = 0x0A8AE5D0。即是所求的物理地址。

    三、手动转换:

    每个PTE的尺寸。在非PAE的x86系统上它是4个字节,PAE的x86上是8个字节。 
    页尺寸。它是0x1000个字节。 
    PTE_BASE虚拟地址。在一个非PAE系统上,它是0xC0000000。 

    使用这数据,你能够计算PTE本身的地址:
    PTE address   =   PTE_BASE  
                    + (page directory index) * PAGE_SIZE
                    + (page table index) * sizeof(MMPTE)
                  =   0xc0000000
                    + 0x0   * 0x1000
                    + 0xb5 * 8
                  =   0xC00005A8

    这是PTE的地址。PTE是个32位双字节DWORD。调查它的内容:

    kd> dd C00005A8 l1
    c00005a8  0a8ae067

    这个PTE的值是0x0a8ae067。它由两个域组成:

    该PTE的低12位是状态标记status flags。这里,这些标记等于0x067 - 或者用二进制表示为0y000001100111。关于状态标记的说明,请看 !pte 参考页。 
    该PTE的高20位等于该PTE的page frame number (PFN)。这里,该PFN是0x0A8AE。 

    该物理页上的第一个物理地址是该PFN乘以0x1000 (左移12位)。字节索引是在该页上的偏移量。因此,你所求的物理地址是0x0A8AE000 + 0x5D0 = 0x0A8AE5D0。这跟以上方法获得的结果相同。

    注:后面这两个方法引用自:http://blog.csdn.net/xiaoqiangvs007/article/details/4650303


    展开全文
  • 虚拟地址转换为物理地址

    千次阅读 2014-07-24 19:10:47
    Linux采用页表的概念来管理虚拟空间,内核在处理虚拟地址时都必须将其转换为物理地址,然后处理器才能够访问。虚拟地址可以通过Linux的页表操作宏逐层查找到物理地址,简单来说需要将虚拟地址分段,每段地址都作为...
  • 操作系统虚拟地址转换物理地址

    千次阅读 2020-01-03 20:08:27
    十进制转换为二进制 0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 10 1011 11 1100 12 11...
  • 虚拟地址转换成物理地址

    千次阅读 2011-05-24 16:29:00
    虚拟存储器的用户空间共有32个页面,每页1K,主存16K,假定某时刻系统为用户的第0、1、2、3页分配的物理块号为5、10、4、7,而该用户作业的长度为6页, 将十六进制的虚拟地址0A5CH、103CH、1A5CH转换成...
  • 我们知道一个虚拟地址要依次经过分段机制转为线性地址,再经过分页机制从线性地址 转换为物理地址虚拟地址是由段标识符:段内偏移来表示。 linux为了便于管理,将所有段标识符都设置为0,这样段内偏移就相当于线性...
  • 本文介绍保护方式下的段定义以及由段选择子及段内偏移构成的二维虚拟地址如何被转换为一维线性地址。 段定义和虚拟地址到线性地址转换 段是实现虚拟地址到线性地址转换机制的基础。在保护方式下,每个段由如下...
  • PAE是Physical Address Extension的缩写,即物理地址扩展。简单来说,就是把IA-32处理器的寻址能力从原来的4GB扩展到64GB。寻址4GB空间,要求物理地址的宽度为32位。类似的,要寻址64GB空间,那么物理地址的宽度就是...
  • 在Linux kernel中经常会用到物理地址虚拟地址转换,先归纳如下: __va():从物理地址转换虚拟地址; __pa():从虚拟地址转换为物理地址;
  • 用户态进程的虚拟地址如何转换成物理地址用户态进程的虚拟地址如何转换成物理地址?mmapmmap基础概念mmap内存映射原理mmap详解UMA和NUMA:mmap优点总结mmap相关函数 用户态进程的虚拟地址如何转换成物理地址? 区分...
  • 思路: 进程号是一个进程在用户空间的唯一...以上便是虚拟地址转换成所对应的实际物理地址的思路。 大致的代码编写流程: 首先根据pid我们可以得到这个进程的task_struct,进而通过task_struct得到mm,通过mm得到pgd。
  • 页表就是用于将虚拟地址转换为物理地址转换关系表。访问虚拟地址时,计算机通过页表找到对应的实际物理地址访问。 我们在上一节介绍了内存管理模块概图, 怎么完成从pgd 到 page的转化呢? linux 内核code是...
  • Linux 虚拟地址到物理地址转换

    千次阅读 2019-03-08 13:58:14
    地址转换过程 概念 虚拟地址和物理地址的概念 CPU通过地址来访问内存中的单元,地址虚拟地址和物理地址之分,如果CPU没有MMU(Memory Management Unit,内存管理单元),或者有MMU但没有启用,CPU核在取指令或...
  • 之前文章讲到利用windbg查询文件的PTE和PDE,现尝试手动实现虚拟地址转换到物理地址。 使用ollydbg打开我们的hello world,查看字符串所在位置: 打开windbg进入内核调试状态,进入该进程,查看该虚拟...
  • 谈起内存管理,首先我们就要搞清楚虚拟地址和物理地址的...虚拟地址,就是就是一种逻辑意义上的地址,而当我们想要访问这个虚拟地址时,是需要转换到物理地址才能够真实的访问到,比如我一个2G的内存,那么虚拟地...
  • Linux 内核 虚拟地址 物理地址 转换

    千次阅读 2015-12-12 15:10:02
    而且这种固定映射最大到896M的地址范围,也即从0xc0000000-0xf7ffffff的虚拟地址采用固定映射,称为内核逻辑地址.剩下的1G-896=128M范围的虚拟地址可以映射到任意物理地址.称为内核虚拟地址.当实际内存大于1G时(实际上...
  • CPU将一个虚拟内存空间中的地址虚拟地址转换为物理地址,需要进行两步:首先将给定一个逻辑地址(其实是段内偏移量,这个一定要理解!!!),CPU要利用其段式内存管理单元,先将这个逻辑地址转换成一个线程地址...
  • 虚拟地址、线性地址和物理地址转换
  • 分页内存管理——虚拟地址到物理地址转换

    万次阅读 多人点赞 2018-08-10 23:30:57
    此篇博客内容在于着重帮助读者明白在分页内存管理下,虚拟地址和物理地址转换计算是怎么进行的。 有关分页内存管理的其他知识请事先参阅有关资料。^_^ 一、在计算之前需要了解如下知识: 1.对每个程序而言,...
  • 虚拟地址到物理地址转换步骤

    千次阅读 2020-08-24 14:52:14
    已知一个虚拟地址0x01AF5518, 则转换的过程如下: 注意: 这里讨论的以Windows下普通模式分页的情况, 也就是2级页表的情况 1.首先把虚拟地址拆分成3个部分(低12位, 中10位, 高10位), 换成2进制如下:  -> 0000 0001...
  •  本文将用一个小例子说明如何在32位cpu下手工将虚拟地址转换内存中的物理地址。(32位xp下测试通过,32位win7不知何因就是不行。大牛若知,请指点,不胜感激。)  首先补充下理论知识:   验证思
  • 一直以来感觉虚拟地址和物理地址之间的相互转换非常麻烦,虚拟地址到物理地址转换由CPU硬件完成,但物理地址虚拟地址怎么转换啊?况且有时候在软件上也希望通过一个物理地址得到虚拟地址,这时候自然不能依赖CPU...
  • MMU的主要作用:虚拟地址到物理地址转换;访问权限控制;设置虚拟存储空间的缓冲。 虚拟存储器:程序一般存于掉电不丢失的硬盘中,但是硬盘读写速度慢。所以系统上电后一般只在ROM中完成小部分硬件初始化程序,并...
  • 虚拟内存与地址转换

    千次阅读 2014-02-28 18:14:27
    虚拟内存无处不在:搞偏底层一点语言的同学可能经常碰到segment fault这类异常...本文主要讲虚拟内存如何把主存当做磁盘上地址空间的快取,以及虚拟内存上的地址到实际物理地址转换 一.虚拟内存用作高速缓存  

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 325,998
精华内容 130,399
关键字:

虚拟地址转换