2011-12-27 39 views
3

以下命令計算Linux機器上每個正在運行的進程的堆棧大小。爲什麼Linux機器上的堆棧大小几乎總是132KiB?

# find /proc -maxdepth 1 -type d -regex '/proc/[0-9]*' -exec cat '{}'/maps \; | grep stack | cut -d' ' -f1 | gawk --non-decimal-data 'BEGIN{FS="-"} {printf "%d\n", (("0x" $2) - ("0x" $1))/1024}' | sort 

在幾乎所有的情況下,堆棧的大小爲132KiB。爲什麼這個號碼如此特別?這是堆棧的最小可能大小嗎?

+0

這可能是使用GCC編譯的C和C++程序的最低限度,這意味着大多數Linux程序。然而,很少有程序超過它的原因是,在編寫良好的C和C++程序中,調用堆棧不是很深,遞歸沒有被廣泛使用,並且在免費商店中分配了非平凡的對象。 – 2011-12-27 20:54:26

+0

只要運行進程的數量不是很多以至於超過了最大命令行大小,就可以簡單地執行'cat/proc/*/maps | grep ...' – caf 2011-12-27 21:26:16

+0

相關,請參閱OSS-Security郵件列表上的[Qualys Security Advisory - Stack Stack](http://www.openwall.com/lists/oss-security/2017/06/19/1)。它展示了一些巧妙的技巧,以及對守衛頁面的漂亮詛咒。它驚人地發現了多少操作系統。 – jww 2017-06-19 22:07:40

回答

4

內核設置在setup_arg_pages()新進程棧128KB的:

stack_expand = 131072UL; /* randomly 32*4k (or 2*64k) pages */ 

當你添加一個4kB的保護頁,是涉及到132KB。如果這個過程從來沒有使用過這麼多堆棧,它將不會被擴展超過這個大小。

+0

在這種情況下,隨機意味着什麼? – Beginner 2011-12-28 00:08:18

+0

「隨機」在這種情況下意味着值的選擇僅僅是因爲需要一個值,而不是由於任何一種研究來確定什麼是最好的初始值。原來的程序員沒有特別的理由去選擇那個特定的值。歡迎來到許多程序員使用的口語英語。 – 2011-12-28 03:32:09

相關問題