通過分段機制和分頁機制實現資料隔離

2022-07-22 09:54:18 字數 1968 閱讀 3433

今天除錯程式的時候,對windows對r3的保護機制很感興趣,為什麼rdata段只可讀,為什麼data可讀寫,為什麼text段不可寫入,只可執行,正好今天沒事幹,這裡就做了個測試,首先檢視程式斷到入口點後,它的物理頁的情況

kd> !dd 1db69000

#1db69000 120a5025 80000000 1e642025 00000000

#1db69010 03481025 80000000 1e85e225 80000000

#1db69020 1db96025 80000000 00000000 00000000

實體地址1db69000-1db69020,分別對應虛擬位址400000-404000

通過上面的值,這裡做下總結:

首先看下data段,它與其它段(除了text段)的唯一區別就是bit9為1,那麼先測試下data,看看它在分頁和分段的共同作用下,結果是怎樣的

page.write	  segment.w		結果

00 00 no

01 00 no

01 01 yes

00 01 yes   

可以看到在物理頁禁止寫入,資料段可以寫入的情況下,仍然可以寫入

那麼再測試下rdata段,它與data段的唯一區別就是bit9為0,那麼這裡測試下它,看看結果是怎樣的

page.write	  segment.w		結果

00 00 no

01 00 no

01 01 yes

00 01 no

可以看到在物理頁禁止寫入,資料段可以寫入的情況下,不能寫入資料了

為什麼會出現這種結果,畢竟402000和403000對應的pte就只有bit9不同,那麼是不是windows用pte的bit9來區分程式中的data段呢,如果bit9為1,那麼在資料段可以寫入的情況下,就算物理頁不讓寫入資料,那麼資料仍然能被寫入物理頁呢,那麼我們修改下402000對應的pte的bit9為1,然後物理頁禁止寫入,資料段允許寫入,這裡做了兩次測試

測試一:  kd> !ed 1db69010 03481225   修改後,402000可以被寫入資料

測算二:  kd> !ed 1db69010 03481025 修改後,402000不能再被寫入資料了

根據這種情況來看,是不是所有的程式段對應的pte的bit9為1,就可以寫入資料了呢,這裡測試下text段

可以看到,不可訪問,並且出現了異常,為什麼會出現這種情況呢,看下text對應的pte,除了bit9不同外,它的bit63也不同,bit63是執行禁止位,其他的都為1,禁止執行,說明不是個**段,而text對應的pte的bit63為0,說明這是個**段,那麼把text對應的pte的bit9置1和bit63置1後,可不可以寫入了呢,為了省點事,這裡修改所有的物理頁

kd> !dd 1db69000

#1db69000 120a5225 80000000 1e642225 80000000

#1db69010 03481225 80000000 1e85e225 80000000

#1db69020 1db96225 80000000 00000000 00000000

od執行,看看結果如何

通過測試,400000-404000的所有位址都可以寫入了

總結:windows通過bit9區分data段,對bit63區分text段,如果bit9為1,bit63為1,那麼windows這逗逼就只會認為它是data段了

Linux之分段機制和分頁機制

通用作業系統的設計原則 盡量縮短系統的平均響應時間並提高系統的吞吐率,在單位時間內為盡可能多的為使用者請求提供服務。如對於整個系統來說,注重所有任務的平均響應時間而不關心單個任務的響應時間,對於某個單個任務來說,注重每次執行的平均響應時間而不關心某次特定執行的響應時間。比如記憶體管理中的lru替換策...

linux分段分頁機制

mmu使用分段單元硬體把邏輯位址轉換為虛擬位址,再使用分頁單元硬體把虛擬位址轉換為實體地址。因為這兩部分表示乙個獨一無二的邏輯位址,虛擬位址作為這個段位址另一種形式,當然也需要這兩個部分作為轉換的 原材料。這裡涉及乙個叫做段的暫存器,它的作用是放段選擇符 識別符號 共有六種 cs 儲存指向 的段的選...

記憶體分段與分頁機制

邏輯位址 線性位址 實體地址 8086cpu 作業系統保護模式下的,啟用分頁機制的位址即虛擬位址,實模式下,虛擬位址和邏輯位址相同 物理記憶體劃分 幀 frame 邏輯記憶體劃分 頁 page 位址匯流排 intel早期cpu20位 記憶體1m 286的位址匯流排24位 記憶體64m 386的位址匯...