[英]Custom handling of memory reads and writes in C
我正在編寫自己的malloc
並使用LD_PRELOAD
技巧來使用它。 我需要能夠為對堆的每次內存訪問執行自定義功能,包括讀取和寫入(性能不是問題,功能是目標)。
例如,對於一些代碼,如
int x = A[5];
我希望能夠捕獲從(A + 5)
讀取的內容,而不是從該內存位置讀取,而是返回我自己的自定義值以存儲在x
。
我目前的想法是:
mprotect
離開,處理產生的 SIGSEGV 並在處理程序中做我需要做的事情。 據我所知,我可以訪問void *si_addr
的錯誤地址,但我不確定如何區分讀取和寫入 - 即使我確實做到了,我也不知道如何處理寫入,因為我不知道要在處理程序中寫入的值。任何建議表示贊賞。
最簡單的方法是通過 malloc(您可能想要擁有 mmap、munmap、mprotect、sig(action、nal 等)...以進行全面覆蓋)。 您的返回地址與有效映射不對應,捕獲 SIGBUS + SIGSEGV,解釋 siginfo 結構以修復您的進程,...但這在某種程度上僅限於在堆上操作,並且程序可以很容易地從中逃脫,如果您正在嘗試捕獲行為不端的程序,該程序可能會損壞您的查找表。
為了更全面地覆蓋,您可能需要查看gvisor ,它被稱為容器運行時沙箱。 它的技術更接近於調試器,因為它可以完全控制目標,捕獲其故障、系統調用等,並管理其地址空間。 它可能是小手術來適應您的需求。
在任何一種情況下,當您出現故障時,您都必須安裝內存並重新啟動程序或模擬指令。 如果您正在處理像 riscv 或 ARM 這樣的干凈架構,仿真還不錯,但是對於像 x86 這樣的過度放縱的架構,您幾乎需要集成 qemu。 如果采用類似gvisor的方式,可以安裝頁面並設置單步標志,然后將單步陷阱上的頁面去掉,這樣麻煩一些。 有一個dtrace的前身,稱為atrace ,它使用這種方法來分析緩存和 tlb 訪問模式。
聽起來是個有趣的項目; 我希望這會順利。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.