Linux
access_process_vm() 在 linux 中是如何工作的?
AFAIK,ptrace 系統呼叫用於
access_process_vm
從其他程序讀取數據。但是,不同程序的地址空間是隔離的,那是如何實現的呢?
程序的地址空間確實是相互隔離的,但它們並沒有與核心隔離。核心總是知道所有活動程序的記憶體佈局。
access_process_vm
工作方式如下:
- 它檢索目標程序的記憶體管理資訊(核心已經知道呼叫程序)
- 它確保它要讀取的頁面被固定在記憶體中(即它們存在,不會被完全釋放,並且存在;這將導致任何已分頁的頁面被重新讀入)
- 它映射核心中的每個遠端頁面,並在適當的方向複製請求的數據。
在 64 位平台上,一般情況下(即頁面不是 I/O 重新映射的頁面),最後一步的映射依賴於核心的直接物理映射:核心可以直接訪問所有物理記憶體。在帶有 的 32 位平台上
HIGHMEM
,這可能涉及創建特定映射。(後者是在kmap
上面最後一個連結中定義的原因highmem.h
——它只需要用於HIGHMEM
。)