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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[保护模式]非PAE模式

發布時間:2025/3/21 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [保护模式]非PAE模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 非PAE 非物理地址擴展
      • 線性地址 有效地址 物理地址
      • CR3
      • PDE/PTE
      • 物理頁的屬性
    • 通過線性地址訪問PDT和PTT
      • 指向PDT的線性地址 0xC0300000
        • 總結
      • 指向PTT的線性地址 0xC0000000/C0001000
        • 總結
      • 訪問PDT與PTT公式總結

非PAE 非物理地址擴展

線性地址 有效地址 物理地址

如下指令:

mov eax,dword ptr ds:[0x12345678]

這個地址如果想訪問成功,首先取決于段機制,看當前的環境能否通過段權限檢查以及是否超過limit限制等等。其次,取決于頁機制。

  • 其中,0x12345678是有效地址
  • ds.base+0x12345678是線性地址
  • 線性地址也不是真正的地址,還有一個地址被稱為物理地址

CPU會通過這個線性地址作為一個目錄,去索引物理地址。問題在于A進程有一個地址0x12345678,B進程也有一個地址0x12345678。那么CPU通過什么去分別找到這兩個相同內存地址的不同的物理地址呢?答案是頁目錄基址。

CR3

每個進程都有一個CR3寄存器,保存頁目錄基址。這個基址是物理地址。CR3指向一個物理頁,一共4096字節,如圖:

PDE/PTE

  • CR3寄存器保存的物理地址指向頁目錄表PDT,里面的每一個成員叫PDE。頁目錄表大小為4KB,每個成員為4個字節。
  • 每一個PDE又指向頁表PTT,里面的每一個成員叫PTE。頁表大小為4KB,每個成員為4個字節。
  • 每一個PTE都指向物理頁,每個物理頁大小為4096個字節
  • PDE與PTE都是4個字節(32位),前20位是物理地址,后12位是屬性
  • PTE可以沒有物理頁,也可以指向物理頁,但只能對應一個物理頁
  • 多個PTE可以指向同一個物理頁
  • 每一個線性地址都會經過一個PDE和PTE最終指向一個物理頁,這個物理頁能不能讀寫取決于經過的PDT和PTE的后12位

物理頁的屬性

  • 物理頁的屬性由PDE和PTE共同決定
  • P:是否有效
  • R/W:是否可讀可寫,0代表只讀,1代表可讀可寫
  • U/S:U/S=0 物理頁只允許特權用戶訪問;U/S=1 物理頁普通用戶也能訪問。高2G以上的內存只有內核才能訪問的原因是U/S位設置的問題,如果將內核的某個頁設置為1,就可以在R3進行訪問了
  • A:是否被訪問過,訪問過設置為1。即使只訪問一個字節也會導致PDE和PTE置1
  • D:是否被寫過;0沒有被寫過,1被寫過
  • PS:只對PDE有意義,PS==PageSize的意思。當PS==1的時候PDE直接指向物理頁,無PTE,低22位是頁內偏移。此時,線性地址只能拆成兩段:大小為4MB,俗稱大頁
  • 9-11位:當P位為0時,CPU會產生缺頁異常,此時這兩位標識了該線性地址是否有效,也標識了該線性地址對應的物理內存所在

通過線性地址訪問PDT和PTT

指向PDT的線性地址 0xC0300000

現在問題來了,如果我們想訪問0這個地址,那么就必須找到PDT和PTT,而CR3里面保存的PDT是物理地址,提供給CPU使用的,代碼只能訪問線性地址。

如何解決這個問題呢?有一個線性地址,指向的是PDT,這個地址就是0xC0300000,下面對這個地址進行拆分

0xC0300000 #二進制為: 1100 0000 0011 0000 0000 0000 0000 0000 #拆成10:10:12 1100 0000 00------>0x300*4=C00 11 0000 0000------>0x300*4=C00 0000 0000 0000

將這個線性地址拆分之后,找到的對應的物理頁就是CR3保存的頁目錄PDT基址所在的物理頁。那就意味著我們可以直接通過這個線性地址去修改PDT。

**結論:**C0300000存儲的值就是PDT,如果我們要訪問第N個PDE,那么有如下公式:

0xC0300000+N*4

總結

  • 通過0xC0300000找到的物理頁就是頁目錄表
  • 這個物理頁既是頁目錄表本身也是頁表
  • 頁目錄表是一張特殊的頁表,每一項PTE指向的不是普通的物理頁,而是指向其他的頁表
  • 指向PTT的線性地址 0xC0000000/C0001000

    也就是說通過0xC0300000這個線性地址可以任意修改頁目錄表,但如果我們要設置某個線性地址PDE和PTE那么還要能夠訪問PTT,如何訪問呢?

    答案是通過這兩個線性地址:0xC0000000/C0001000。

    通過拆分可以知道,訪問0xC0000000這個地址就等于是訪問第一個PTT表;訪問C0001000這個地址就等于是訪問第二個PTT表。兩個地址之間相差0x1000。如果想訪問第三個PTT表的話以此類推。

    總結

  • 頁表被映射到了從0xC0000000到0xC03FFFFF的4M空間
  • 在這1024個表中有一張特殊的表:頁目錄表
  • 頁目錄表被映射到了0xC0300000開始處的4K地址空間
  • 訪問PDT與PTT公式總結

    PDI:頁目錄表索引

    PTI:頁表索引

    訪問頁目錄表的公式:0xC0300000+PDI*4

    訪問頁表的公式:0xC0000000+PDI*4096+PTI*4
    與PTT公式總結

    PDI:頁目錄表索引

    PTI:頁表索引

    訪問頁目錄表的公式:0xC0300000+PDI*4

    訪問頁表的公式:0xC0000000+PDI*4096+PTI*4

    總結

    以上是生活随笔為你收集整理的[保护模式]非PAE模式的全部內容,希望文章能夠幫你解決所遇到的問題。

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