2016-12-10 14 views
1

私はプロセスメモリ管理を研究しています。Linuxのメモリ管理 - "ランダムxxxオフセット"を取得する方法?

投稿を読むプロセスのアドレス空間のレイアウト。私などのLinux、start_data、END_DATA、start_brk、BRK、以下においてURL.

processMemlayout

を参照

は、構造体mm_structについてのメンバ変数です。

しかし、計算方法を知りたいランダムbrk、スタック、mmapオフセット。

これらの3つの値(ランダムxxxオフセット)は構造体mm_structで定義されていないようです。

これらの値を計算する関数またはMACROはありますか?

私はLinuxカーネルバージョン4.4とx86-64アーキテクチャを使用しています。

ありがとうございます。

+0

セグメントがプロセスのどこにあるか、または乱数を計算する方法を知りたいですか?プロセスが作成されると、それらは修正されます。無作為化は、ハッキングするのが難しくなるため、ハッカーはスタックまたはヒープから物を読み取る場所を正確に把握していません。 – e0k

+0

@ e0kありがとうございました。私はセグメントがどこにあるか知りたい。 たとえば、start_codeとend_codeの間にコードセグメントが存在します。 start_dataとend_dataの間にもデータセグメントが存在します。 私はBssセグメントについて知りたいです。 ** Bssセグメントはend_dataで開始します**しかしBssセグメントの終了位置はわかりません。 – newbie16

+0

@ newbie16 BSSはカーネルの特定の変数には格納されませんが、対応する場所に割り当てられたVMAがあります。 –

答えて

1

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; 
...... 
} 
  1. 。START_CODE、コードセクションの開始と終了アドレスをEND_CODEを。

  2. start_data、end_dataデータセクションの開始アドレスと終了アドレス。

  3. start_brk、brkヒープの開始アドレスと終了アドレス。

  4. start_stack予想通りに、スタック領域の開始。

関連する問題