2009-01-04 16 views
0

是否存在一種方法來捕獲寫入寫保護頁面?寫保護的虛擬頁面,趕上寫

我打算做一個自我喜歡的對象系統,在其中複製對象來實例化它。 (因爲它聽起來簡單而緊湊)顯然,爲此目的創建的對象應該以某種方式被寫保護。我已經看到有一種方法可以標記ELF中程序頭部寫保護的內容。 (RE,RWE,RW-標誌)

這是否提供寫保護?我記得它應該引起段錯誤,這是真的嗎?如何將寫入寫入寫保護頁面。這是一個很好的方式來實現我想要的,有沒有更好的方法?

回答

1

是的,你可以使用mprotect

是的,寫保護內存會引發段錯誤。您可以安裝處理程序,例如在C++:

std::signal(SIGSEGV, my_segv_handler_func); 

這是做你想要什麼,但你不得不增加很多額外的管理黏性物質,使其工作的一個可行辦法。例如,這種寫入檢測是在硬件中完成的,而在x86架構上,您的頁面大小爲4k。因此,您可以一次保護4k個事物,並在4k邊界上對齊 - 而不是通用的「地址X處的起始地址和N個字節」。我相信你要麼必須

  1. 有對象來頁的映射 ,這樣你可以識別 寫入到一個頁面是否是一個 特殊保護對象的寫,或
  2. 滾你自己的malloc始終 上分配4K爲邊界,這將迫使你要使用的4K

一個 最小alloc'd塊大小我不知道把我的頭頂部,如果有一個更好的辦法,但玩起來聽起來很有趣。 :)