zoukankan      html  css  js  c++  java
  • 10-10-12 分页机制

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

    10-10-12 分页机制

    1. CPU是如何通过线性地址查找物理地址的?

    2. MMU是什么?

    3.CPU内存管理内部大体结构框架?

    4.会写、直接、不缓存什么概念?

    5.CR3、PDE、PTE之间的关系?

    6.用一进程的内存结构分析

    7.操作系统与CPU的页密度

    8.使用!vtop指令解析物理地址

    9.通过挂物理页来实现0地址读写

    10.修改PDE与PTE属性来实现对只读内存(字符串)的操作

    11.页属性的A位、D位(Dirty脏位)与G位的说明

    12.PDE的PS位(大页)

     

    1. CPU是如何通过线性地址查找物理地址的?

      通过一块MMU内存控制单元

     

    2. MMU是什么?

      内存管理单元,是一个模块(我们也可以看成一个函数)。

      物理地址 func(CR3,线性地址);

      其就是将线性地址按我们的步骤拆分成物理地址(10-10-12)。

     

    3.CPU内存管理内部大体结构框架?

      

     

    4.回写、直接、不缓存什么概念?

      三者都是针对缓存来讲的。

      1)回写:先写到缓存,等一会数据量够了再写到内存中。

      2)直写:写到缓存的同时直接写到内存中。

      3)不缓存:不经过缓存,直接写到内存中。

     

    5.CR3、PDE、PTE之间的关系?

     

     

    6.用一进程的内存结构分析

        将一全局变量的程序运行两份进程,地址同时打印出来,然后观察两者的PTE结构。
        结论,一个程序运行多份,挂的不是同一个物理页。
        Failed to get VadRoot
        PROCESS 815d78b0  SessionId: 0  Cid: 00fc    Peb: 7ffdf000  ParentCid: 0604
            DirBase: 18d4f000  ObjectTable: e21786b8  HandleCount:   7.
            Image: pteTest.exe
        
        Failed to get VadRoot
        PROCESS 81e96528  SessionId: 0  Cid: 00d8    Peb: 7ffd5000  ParentCid: 0604
            DirBase: 193d7000  ObjectTable: e21f4ea8  HandleCount:   7.
            Image: pteTest.exe
        
        第一种情况
        18d4f000
        18c5a000
        18943000
        18943a30 02
        
        第二种情况
        193d7000
        19670000
        1950a000
        1950aa30  02

     

    7.操作系统与CPU的页密度

        操作系统以64K为单位,CPU以4K为单位。
        因此申请一块内存,最小不是4K而是一次64K,但是在内核记录时却被记录成多个4K的页的个数。

     

    8.使用!vtop指令解析物理地址

    对于分页的拆分,我们往往得到进程的CR3然后手动来拆分,当然如果我们熟练的话,可以直接使用!vtop指令。该指令会手动地帮助我们拆分物理地址。
        !vtop [CR3地址] [物理地址]
        使用效果:
        kd> !vtop 1a3c9000 425a30
        X86VtoP: Virt 0000000000425a30, pagedir 000000001a3c9000
        X86VtoP: PDE 000000001a3c9004 - 19f1d067 (PDE)
        X86VtoP: PTE 0000000019f1d094 - 1a286067 (PTE)
        X86VtoP: Mapped phys 000000001a286a30 (物理地址)
        Virtual address 425a30 translates to physical address 1a286a30.

     

    9.通过挂物理页来实现0地址读写

    线性地址0本质就是没有挂物理页,只要我们挂上物理页很容易实现
        源代码:
        #include "stdafx.h"
        int x = 123;
        int main(int argc, char* argv[])
        {
            printf("%x ",&x);
            getchar();
            getchar();
            getchar();
            printf("%d ",*(int*)0);
            return 0;
        }
        操作方法:通过查看变量x的地址来获取其物理页的PDE、PTE,在windbg中修改零地址对应的PDE、PTE(其实只修改PTE即可,一般就是该位置为0),然后你发现就可以读取数据并不会报错。

     

    10.修改PDE与PTE属性来实现对只读内存(字符串)的操作

      注意:限制可能还被段限制,但一般是页限制,因为段一次就要限制很多,一般不会做过多限制。
        我们知道PDE与PTE的后三位代表属性,具体属性见下图:

      

       其该物理页的最终属性是 PDE & PTE 的结果。
        我们结合!vtop指令,能让本来不可写的内存改为可写,具体操作如下。
        #include "stdafx.h"
        int main(int argc, char* argv[])
        {
            char *str = "abc";
            printf("%x",str);
            getchar();
            getchar();
            getchar();
            str[0] = 'b';
            printf("%s",str);
            return 0;
        }
        其该地址 !vtop 解析的结果:
        kd> !vtop 0de1d000 423020
        X86VtoP: Virt 0000000000423020, pagedir 000000000de1d000
        X86VtoP: PDE 000000000de1d004 - 0b925067
        X86VtoP: PTE 000000000b92508c - 03014025
        X86VtoP: Mapped phys 0000000003014020
        Virtual address 423020 translates to physical address 3014020.
        通过分析可以看出是其PTE的属性加以修改和限制,我们来修改这个即可。
        !dq b92508c  03014067
        之后运行程序,就可以发现其被修改。

     

    11.页属性的A位、D位(Dirty脏位)与G位的说明

      TLB存储缓存时当写满了会进行优化,然后找到最差的将其删除,来空出位置添加新的。
        A表示访问,D表示写入,G表示不可删除。
        TLB表中存在A位与D位的计数索引,来达到优化的目的,但是如果G位为1,则及时其是性能最差的,其CPU也不会将其从TLB中删除的。

     

     

    12.PDE的PS位(大页)

        大页是以4M为一个单位,当你一次申请100M的内存时,其可能给你分配个大页。
        当遇到大页时,其没有PTE,后面22位就是偏移地址,在PDE的基础上来计算其偏移地址就好,这很好理解。

  • 相关阅读:
    (萌O(∩_∩)O)哈希知识点小结
    hash应用以及vector的使用简介:POJ 3349 Snowflake Snow Snowflakes
    BestCoder Round #3HDU 4907
    搜索:POJ2251&POJ1426&POJ3087&POJ2488
    母函数初学四大题
    欧拉函数知识点总结及代码模板及欧拉函数表
    欧几里德与扩展欧几里德算法以及青蛙的约会~
    KMP 知识点总结
    HDU 1142 A Walk Through the Forest(dijkstra+记忆化DFS)
    HDU 1535 Invitation Cards(SPFA,及其优化)
  • 原文地址:https://www.cnblogs.com/onetrainee/p/12512847.html
Copyright © 2011-2022 走看看