簡體   English   中英

在 C 中自定義處理內存讀寫

[英]Custom handling of memory reads and writes in C

我正在編寫自己的malloc並使用LD_PRELOAD技巧來使用它。 我需要能夠為對堆的每次內存訪問執行自定義功能,包括讀取和寫入(性能不是問題,功能是目標)。

例如,對於一些代碼,如

int x = A[5];

我希望能夠捕獲從(A + 5)讀取的內容,而不是從該內存位置讀取,而是返回我自己的自定義值以存儲在x

我目前的想法是:

  1. mprotect離開,處理產生的 SIGSEGV 並在處理程序中做我需要做的事情。 據我所知,我可以訪問void *si_addr的錯誤地址,但我不確定如何區分讀取和寫入 - 即使我確實做到了,我也不知道如何處理寫入,因為我不知道要在處理程序中寫入的值。
  2. 調整 gcc 以專門處理內存訪問。 從我讀過的內容來看,理解 gcc 代碼需要一段時間,除非它的 IR/抽象程序集方便地隔離內存加載/存儲,否則我不確定這有多實用。

任何建議表示贊賞。

最簡單的方法是通過 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM