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

物理ページアドレスの読み取りをぶら下げによって達成0 9

PDEおよびPTE 10変更操作が読み取り専用属性メモリに実装されている(文字列)

11.ページ属性ビットのA記述、Dビット(ダーティダーティビット)と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の構造を観察します。
    結論は、プログラムは、同じ物理ページにリンクされていない複数のコピーを、実行します。
    GET VadRoot失敗への
    プロセス815d78b0のSessionId:0シド:00FC PEB:7ffdf000 ParentCid:0604
        DirBase:18d4f000 ObjectTable:e21786b8 HandleCount:7.
        画像:pteTest.exeは    VadRootに取得に失敗しました    プロセスを81e96528のSessionId:0シド:00d8 PEB:7ffd5000 ParentCid: 0604         DirBase:193d7000 ObjectTable:e21f4ea8 HandleCount:7.         画像:pteTest.exe     最初のケース    18d4f000     18c5a000     18943000     18943a30 02     秒ケース    193d7000     1967万    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\n",&x);
        getchar();
        getchar();
        getchar();
        printf("%d\n",*(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的基础上来计算其偏移地址就好,这很好理解。

おすすめ

転載: www.cnblogs.com/onetrainee/p/12512847.html