2011-08-06 150 views
1

因此,可以說我有機會獲得一個過程,它的mm_struct一個用戶進程更改頁面映射,是沒有辦法,我可以改變映射的一個或刪除的映射,並創建一個臨時的,這樣的方式我可以分配一個小於一頁的數量,並寫入內存?在Linux內核中

例如,在ADD指令上處理寫入錯誤。我可以相對容易地得到錯誤的地址和大小。我在本地分配8個字節(最大的單個指令大小)並且映射混亂,使得故障的虛擬地址指向這8個字節的第一個字節。然後單步執行指令以獲取用於其他頁面的數據,然後將原始頁面還原到映射。我只是好奇,是否可以在虛擬內存區域中使用除頁面以外的其他內容。

回答

2

計算機的底層架構定義了您可以使用虛擬內存和無法使用的虛擬內存。您還沒有指定您的架構,但我相當確信它不會讓您管理小於一頁的單元。

但是爲了解決更大的問題,爲什麼內存大小很重要?每個線程只需要一次該分配,只有當它發生故障時,它纔會分配給單個用戶空間指令。只需使用新的乾淨頁面臨時映射到您的流程即可獲得書面價值。它可能比較容易編寫,並且它具有更好的安全性:它可以避免將內核數據暴露給不可信任(明顯錯誤)的應用程序。

+0

這是真的,因爲內存開銷並不是很大,因爲它只有4或8k的頁面大小,即使最多隻能使用前8個字節。作爲一個旁註,你會碰巧知道單步執行用戶空間指令(顯然是從內核空間)的最簡單方法嗎? –

+0

@Jesus:我不知道確切的,但我會首先查看['ptrace()'](http://linux.die.net/man/2/ptrace)中使用的代碼來實現' PTRACE_SINGLESTEP'請求。 – Karmastan