AFAIK, ptrace システムコールは、access_process_vm
他のプロセスからデータを読み取るために使用されます。しかし、異なるプロセスのアドレス空間はどのように達成されますか?
答え1
プロセスのアドレス空間は実際には互いに分離されていますが、カーネルでは分離されません。カーネルは常にすべてのアクティブプロセスのメモリレイアウトを知っています。access_process_vm
仕組みは次のとおりです。
- それターゲットプロセスのメモリ管理情報を取得します。(カーネルは呼び出しプロセスについて既に知っています。)
- それ読みたいページがメモリに固定されていることを確認してください。(つまり存在するが完全に解放されずに存在するので、呼び出されたすべてのページを再度読み取ることになります。
- それカーネルのすべてのリモートページマッピング、要求されたデータを適切な方向にコピーします。
64ビットプラットフォームでは、通常(つまりこのページはI / O再マップされたページではなく、最後のステップのマッピングはカーネルによる直接の物理マッピングに依存します。カーネルはすべての物理メモリに直接アクセスできます。 32ビットプラットフォームでは、HIGHMEM
特定のマッピング生成を含めることができます。 (後者がkmap
上記の最後のリンクで定義されている理由ですhighmem.h
。ただしなければなりませんHIGHMEM
。)