2016-07-03 14 views
0

我試圖計算從堆棧開始到當前堆棧指針的偏移量。如何從/ proc/[pid]/maps獲取真正的堆棧基礎?

當我讀到的/ proc/[PID] /地圖我看

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

0xbefdf000看起來像堆棧起始地址。 問題是,當我看着gdb中的SP寄存器時,實際堆棧指針就像0xbefff440。

堆棧從高地址增長到低地址,但0xbefff440大於0xbefdf000,實際堆棧指針的高於/ proc/*/maps的最高堆棧地址的可能性如何?

根據gdb內存檢查函數最高可讀堆棧地址是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'表示所有地址x都帶有'0xbefdf000 <= x <0xbeffffff',但是由於所討論的地址在邊界處不正確,所以無論如何不重要。 –

+0

噢,謝謝。我不留神,認爲第一個地址更高,我沒有注意到第二個地址是b ** F ** 000000我認爲它是b ** E ** 000000 – user554738

0

這兩個地址是堆棧可以在的兩個邊界。如果嘗試執行堆棧操作會使其超出一個限制(在本例中爲較低或開始地址),操作系統將嘗試增加堆棧段,降低低優先級以爲新的堆棧條目騰出空間,或者可能發送SEGV信號,以防擴展堆棧失敗(例如,如果它會與程序中斷AKA堆重疊)

第一次推入寫入段的最後幾個字節。