前言:PDE_PTE屬性(U/S位和PS位和A位和D位)的筆記
上一篇筆記已經學習過了R/W位和P位,一個是讀寫位,還有一個是有效位,這里的話繼續來學習相關的U/S位和PS位和A位和D位
U/S位
U/S位是PDE和PTE都具備的屬性,這個屬性的含義是表示訪問指定的物理頁的用戶是否為特權用戶
U/S = 0 特權用戶
U/S = 1 普通用戶
練習
修改一個高2G線性地址的PDE/PTE屬性,實現Ring3可讀.
拆分
0x8003F00C
->
1000 0000 00 *4->800
00 0011 1111 *4->FC
00C
修改該線性地址對應的PDE和PTE的U/S位為1即可,修改如下
PDE的修改如下
PTE的修改如下
結果如下,訪問發現報錯
查了別人的文章,發現說可能還需要改變下G位,置為0
參考文章:https://blog.csdn.net/qq_18059143/article/details/103285462
再次進行測試,可以成功進行讀取了
學習到了這里我們就可以總結兩種方法在8086中訪問高2G的內存了
第一種是通過門提權來進行0環,然后去讀內存,其實就是通過段提高了權限來訪問高2G
第二種就是今天學習的就是通過修改PDE和PTE的的U/S位的屬性,然后去讀內存,其實也就是降低了頁的權限來訪問高2G(可能有人會問,那段呢?默認數據段就是可以訪問對應的RPL為3的段描述符的呀,所以段肯定是可以的!)
總結相關知識點:
1、2G以上是內核才能訪問的原因是U/S位的設置問題,如果將內核的某個頁設置為1 就可以在R3訪問了(理解)
2、0 1 2是系統環 可以訪問系統頁和用戶頁。0環是特權級環,1、2環雖然不是特權級環,但是也是系統環,3環是用戶環,可以訪問用戶頁(沒有真正的理解這個點的意思)
關於PDE和PTE的G位
意思好像就是如果置1的話,那么如果當前的PDE或者PTE被改變,但是不會導致頁屬性失效,還是保持原來的頁屬性
PS位
只對PDE有意義,PS == PageSize的意思當PS==1的時候 PDE直接指向物理頁 無PTE,低22位是頁內偏移。
線性地址只能拆成2段:大小為4MB,俗稱"大頁"
所以在看PDE的時候,先看P位,再看PS位,如果PS位不是為1,那么就正常4kb的看,如果不是那么就是大頁,低22就是業內偏移
練習
分析8043F00C線性地址的PDE屬性
拆分
8043F00C
->
1000 0000 01 *4 -> 0x804
00 0011 1111 *4 -> 0xFC
00C
來進行尋找對應的PDE,如下圖所示,為0x004009e3
對0x004009e3進行拆分
第低2位為e -> 1110,那么ps位1,所以PDE指向的就直接是物理頁了,那么偏移地址為低22位是頁內偏移,也就是00 0000 1001 1110 0011 -> 0x9e3
A位
是否被訪問(讀或者寫)過,默認為0,如果訪問過則置1,即使只訪問一個字節也會導致PDE/PTE的A位置1
D位
D(dirty),個人理解,所以被稱呼為臟位
D臟位:是否被寫過,默認為0,0沒有被寫過,1被寫過
無效的PTE
老師講解了當P位為0的時候,也就是PTE無效的時候的多種情形,它的過程為如下:
- 先檢查P位是否有效
-
- 如果P位無效,那么就會查詢中斷描述表中的第E個段描述符,產生異常
-
-
- 再接着操作系統就會根據如下圖中去查詢PTE的情況
-
-
-
-
- 最后根據下面對應的幾種處理來進行處理
-
-