50.Linux/Unix 系統程式設計手冊(下) -- 虛擬記憶體操作
阿新 • • 發佈:2018-12-18
1.mprotect() 修改一塊虛擬記憶體區域上的保護資訊 如果一個程序在訪問一塊記憶體區域時違背了記憶體保護,核心會發送 SIGSEGV 訊號。 2.記憶體鎖: mlock() 和 mlockall() 將一塊虛擬記憶體區域鎖進實體記憶體,從而防止它被交換出去。 將一個程序的虛擬記憶體的部分或全部鎖進記憶體以確保它們總是位於實體記憶體中是非常有用的。之所以這樣做的一個原因是它可以提高效能。 對被鎖住的分頁的訪問可以確保永遠不會因為分頁故障而發生延遲。這對於那些需要確保快速響應時間的應用程式來說是很有用的。 給記憶體加鎖的另外一個原因是安全。如果一個包含敏感資料的虛擬記憶體分頁永遠不會被交換出去,那麼該分頁的副本就不會被寫入到磁碟。 如果該分頁被寫入磁碟,那麼從理論上來說就可以在後面某個時刻直接從磁碟讀取該分頁。(攻擊者可能會故意通過執行一個消耗大量記憶體的程式 來構造這種場景,從而強制其他程序佔據的記憶體被交換到磁碟上).由於核心不保證會清除交換空間中儲存的資料,因此即使在程序終止之後也可能 從交換空間中讀取資訊。 記憶體鎖不會通過 fork() 建立的子程序繼承,也不會在 exec() 執行期間被保留。 mlock(); munlock(); mlockall(); munlockall(); 3.確定記憶體駐留性: mincore() 讓一個程序能夠確定一塊虛擬記憶體區域中的分頁是否駐留在實體記憶體中。 4.建議後續的記憶體使用模式: madvise() 讓一個程序能夠對其虛擬記憶體區域的使用模式報告給核心。 madvise() 系統呼叫通過通知核心呼叫程序起始地址 addr,長度為 length 位元組的範圍之內的分頁的可能的使用情況來提升應用程式的效能。核心可能 會使用這種資訊來提升在分頁之下的檔案對映上之下的IO效率。