日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows保护模式学习笔记(七)—— PDEPTE

發布時間:2025/3/21 windows 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows保护模式学习笔记(七)—— PDEPTE 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Windows保護模式學習筆記(七)—— PDE&PTE

    • Cr3
      • PDE(頁目錄表項)
      • PTE(頁表項)
      • 物理頁的屬性
      • 10-10-12分頁的補充
    • 實驗1:證明PTE的特征1
      • 第一步:選擇一個進程的Cr3
      • 第二步:查看頁表
    • 實驗2:通過修改頁表使C語言能在0地址處讀寫
      • 第一步:得到一個變量的地址
      • 第二步:掛載PTE為0的物理頁
      • 第三步:繼續運行程序
    • 實驗3:通過修改物理頁屬性使字符串常量可修改
      • 第一步:運行程序
      • 第二步:修改對應PTE的屬性
      • 第三步:繼續運行程序
    • 實驗4:通過修改物理頁屬性使普通用戶讀取高2G內存
      • 第一步:運行如下代碼
      • 第二步:修改PDE與PTE的U/S位
      • 第三步:繼續運行程序

Cr3

描述:

在所有的寄存器中,只有Cr3存儲的是物理地址,其它寄存器存的都是線性地址
Cr3所存儲的物理地址指向了一個頁目錄表(PDT)
在Windows中,一個頁的大小通常為4KB,即一個頁可以存儲1024個頁目錄表項(PDE)

物理頁結構圖:

PDE(頁目錄表項)

描述:

頁目錄表(PDT)的每一項元素稱為頁目錄表項(PDE)
每個頁目錄表項指向一個頁表(PTT)
每個頁表的大小為4KB,即一個頁表可以存儲1024個頁表項(PTE)

PTE(頁表項)

描述:

頁表(PTT)的每一個元素稱為頁表項(PTE)
頁表項(PTE)所指向的才是真正的物理頁

特征:

  • PTE可以指向一個物理頁,也可以不指向物理頁
  • 多個PTE可以指向同一個物理頁
  • 一個PTE只能指向一個物理頁
  • 物理頁的屬性

    物理頁的屬性=PDE屬性& PTE屬性


    P位:是否有效位
    注意:當PDE或PTE中有一個的屬性P=0時,物理頁就是無效的

    R/W位:讀寫位
    R/W=0:只讀
    R/W=1:可讀可寫

    U/S位:權限位
    U/S=0:特權用戶
    U/S=1:普通用戶

    PS位:PDE特有
    PS == PageSize
    PS=1:PDE直接指向物理頁,低22位=頁內偏移,偏移最大值為4MB,俗稱"大頁"
    PS=0:PDE指向PTE

    A位:訪問位
    A=1:該PDE/PTE被訪問過
    A=0:該PDE/PTE未被訪問過

    D位:臟位
    D=1:該PDE/PTE被寫過
    D=0:該PDE/PTE未被寫過

    注:其他位等學完控制寄存器與TLB才能講,本篇不講

    10-10-12分頁的補充

    為什么要按10-10-12分頁:

  • 一個物理頁的大小為4096字節,即2的12次方,若要遍歷整個物理頁,則需要12個比特位
  • 一個頁表有1024個頁表項,1024等于2的十次方,即需要10個比特位
  • 頁目錄表項同理,也需要10個比特位
  • 注:以下實驗的分頁方式都為10-10-12分頁

    實驗1:證明PTE的特征1

    第一步:選擇一個進程的Cr3

    我這里啟動了一個記事本:notepad.exe

    第二步:查看頁表

    查看當線性地址為0時,進程的頁表

    可以發現有許多頁表項都為0,沒有指向任何物理頁

    實驗2:通過修改頁表使C語言能在0地址處讀寫

    第一步:得到一個變量的地址

    運行代碼如下:

    #include <stdio.h> #include <windows.h>int main(int argc, char *argv[]) {int x = 1;printf("x的地址:%x\n", &x);getchar();// 向0地址寫入數據*(int*)0 = 123;// 從0地址讀出數據printf("0地址的數據:", *(int*)0);getchar();return 0; }

    程序運行后,首先會輸出x的地址

    第二步:掛載PTE為0的物理頁

    使用WinDbg將虛擬機中斷,將變量x所在的物理頁掛載到線性地址0的PTE

    第三步:繼續運行程序

    運行結果:

    成功對0地址進行了讀寫,實驗成功!

    實驗3:通過修改物理頁屬性使字符串常量可修改

    第一步:運行程序

    代碼如下:

    #include <stdio.h> #include <windows.h>int main(int argc, char *argv[]) {char *str = "Hello World";printf("線性地址:%x", str);getchar(); // 讓程序執行到這里//修改只讀變量str[0] = 'M';printf("修改后的值:%s\n",str);return 0; }

    這時候得到了str的地址:

    第二步:修改對應PTE的屬性

    第三步:繼續運行程序

    運行結果:

    修改成功!

    實驗4:通過修改物理頁屬性使普通用戶讀取高2G內存

    第一步:運行如下代碼

    #include <stdio.h> #include <windows.h>int main(int argc, char *argv[]) {PDWORD p = (PDWORD)0x8003F00C;getchar(); // 讓程序運行到這里printf("讀取高2G內存:%x \n", *p);return 0; }

    第二步:修改PDE與PTE的U/S位

    第三步:繼續運行程序

    運行結果如下:

    成功讀取了高2G的內存!

    總結

    以上是生活随笔為你收集整理的Windows保护模式学习笔记(七)—— PDEPTE的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。