我正在研究一個內存跟蹤庫,我們使用mprotect
來刪除對大部分程序內存的訪問以及一個SIGSEGV處理程序,以便在程序觸及時恢復對單個頁面的訪問。這在大多數情況下都很有效。如何在給定受保護的內存時使系統調用調用我的SIGSEGV處理程序?
我的問題是,程序調用系統調用(比如read
)與我的圖書館沒有標明存取存儲器時,系統調用只是返回-1,並將errno
到EFAULT
。這以奇怪的方式改變了正在測試的程序的行爲。我希望在實際進入內核之前能夠恢復對系統調用的每個內存頁面的訪問。
我目前的做法是爲每個接觸內存的系統調用創建一個包裝。每個包裝器在將其交給真正的系統調用之前都會觸及給予它的所有內存。看起來這樣可以直接從程序中調用,但不適用於由libc創建的調用(例如,fread
將直接調用read
而不使用我的包裝)。有沒有更好的方法?怎麼可能得到這種行爲?
那真是愚蠢。當系統調用無效內存時,誰期望EFAULT而不是段錯誤? :P看起來像系統調用和用戶空間函數之間的隨機不一致...... – 2012-03-07 16:08:51