2011-12-27 6 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++プログラムでは、呼び出しスタックがあまり深くなく、再帰が広く使われておらず、フリー・ストア上に自明でないオブジェクトが割り当てられているからです。 –

+0

実行中のプロセスの数がそれほど多くなくても、コマンドラインの最大サイズを超えていれば、 'cat/proc/*/maps | grep ... ' – caf

+0

関連、[Qualys Security Advisory - The Stack Clash](http://www.openwall.com/lists/oss-security/2017/06/19/1)のOSS-Securityメーリングリストを参照してください。それはいくつかのきちんとしたトリックを示し、ガードページをかなり害しています。彼らがそれを使っていくつのOSを驚かせたかは驚くべきことです。 – jww

答えて

4

カーネルはsetup_arg_pages()に128kBのに新しいプロセスのスタックを設定します:あなたは、単一の4kBガードページを追加すると、それが132KBになる

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

。プロセスがこれ以上のスタックを使用したことがない場合、このサイズを超えて展開されることはありません。

+0

この場合ランダムに何を意味しますか? – Beginner

+0

この場合「無作為に」とは、値が必要であったために値が選択されたことを意味し、何が最良の初期値であるかを決定するための調査の種類によるものではありません。元のプログラマーは、その特定の価値を選択する特別な理由はありませんでした。多くのプログラマーが使用している口頭で英語にようこそ。 –

関連する問題