OSは既に、/ proc/< pid>/mapsを実装しています。このマップは、スタック、ヒープ、そしてもちろんmmap-edのものを含む、そのプロセスのすべてのVMAを表示します。 FSは/ proc/task_mmu.c:
あなたは、これらすべての情報は、あなたがカーネルのソースコードを確認することができ埋めるところから確認したい場合は、関連するコードは(与えられたPIDのVMAsを検索する)は、ここのようです。
そして、はい確かに、 "[ヒープ]" 上記のsrcファイルからこのコードスニペットでマークされている(3.10.24版カーネル):
FSは/ proc/task_mmu.c:show_map_vma()
...
if (vma->vm_start <= mm->brk && vma->vm_end >= mm->start_brk)
{
name = "[heap]"; goto done; }
...
そしてもう一つは、あなたがで定義されているmm_structについてをご確認ください、特定のセグメントの開始・終了アドレスを確認したい場合。あなたは、次のものを取得します: -
struct mm_struct{
......
unsigned long start_code, end_code, start_data, end_data;
unsigned long start_brk, brk, start_stack;
......
}
。START_CODE、コードセクションの開始と終了アドレスをEND_CODEを。
start_data、end_dataデータセクションの開始アドレスと終了アドレス。
start_brk、brkヒープの開始アドレスと終了アドレス。
start_stack予想通りに、スタック領域の開始。
セグメントがプロセスのどこにあるか、または乱数を計算する方法を知りたいですか?プロセスが作成されると、それらは修正されます。無作為化は、ハッキングするのが難しくなるため、ハッカーはスタックまたはヒープから物を読み取る場所を正確に把握していません。 – e0k
@ e0kありがとうございました。私はセグメントがどこにあるか知りたい。 たとえば、start_codeとend_codeの間にコードセグメントが存在します。 start_dataとend_dataの間にもデータセグメントが存在します。 私はBssセグメントについて知りたいです。 ** Bssセグメントはend_dataで開始します**しかしBssセグメントの終了位置はわかりません。 – newbie16
@ newbie16 BSSはカーネルの特定の変数には格納されませんが、対応する場所に割り当てられたVMAがあります。 –