2016-07-03 9 views
0

私はスタックの開始から現在のスタックポインタへのオフセットを計算しようとしています。/proc/[pid]/mapsからactiveallスタックベースを取得する方法は?

私は/ procの/ [PID] /マップを読んだとき、私は

befdf000-bf000000 rwxp 00000000 00:00 0   [stack] 

0xbefdf000を見るには、スタックの先頭アドレスのように見えます。 問題は、gdbの実際のスタックポインタが0xbefff440のようなものであるということです。

0xbefff440が0xbefdf000より大きい場合、実際のスタックポインタが/ proc/*/mapsからのスタックアドレスよりも高い可能性はありますか?

gdb memory examine関数の最高可読スタックアドレスは0xbeffffffで、これは実際のスタックの開始と似ていますが、procマップではbefdf000は何ですか?もしそれが本当のスタックベースでないなら、/ proc /からどのように0xbeffffff(ASLRが有効になっているかもしれない)を得るか?

私はqemuのARM Debianでテストを行っています。 ASLRを無効にして、異なるプログラム実行間でスタックアドレスが変更されないようにしました。

答えて

1

あなたが求めているものは得られません。おそらくあなたの数学はちょうど間違っています。 0xbefff440は0xbefdf000から0xbeffffffの範囲にあり、期待される範囲の先頭近くにあります。

+0

しかし、/ proc/*/mapsによるbefdf000-bf000000の範囲はありませんか? 0xbefff440はbefdf000-bf000000の範囲にはなく、それは私を混乱させます – user554738

+0

ええ、そうです。 0xbf000000は0xbeffffffの直後のアドレスであり、0xbefff440はそれより少し下にある。範囲は半開間隔で表されるので、 '0xbefdf000-0xbeffffff'は' 0xbefdf000 <= x <0xbeffffff'のすべてのアドレスxを意味しますが、問題のアドレスは関係のない境界で正しくないためです。 –

+0

ああ、ありがとう。私は不注意で、最初のアドレスが高いと思った、私は2番目のアドレスが気付いていないb ** F ** 000000私はそれがB ** E ** 000000だと思った – user554738

0

2つのアドレスは、スタックができる2つの境界です。スタック操作を試みると1つの限界(この場合は下位アドレスまたは開始アドレス)を越えて拡張しようとすると、OSはスタックセグメントを増やそうと試み、新しいスタックエントリのためのスペースを作るためにローエッジを下げようとします。スタックを拡張できない場合のSEGVシグナル(例えば、プログラムブレークAKAヒープと重なる場合)

最初のプッシュはセグメントの最後のバイトに書き込みます。

関連する問題