2016-06-01 19 views
3

私はスタックのサイズが制限機能によって制御可能であることは知っていますが、カーネルはRLIMIT_STACKなどのこれらの制限のいくつかをどのように強制しますか? linuxはスタック操作に関与していないので(これは単なるmovまたはpush命令です)、制限を超えたときにカーネルはどのようにSIGSEGVを発行しますか?私は仮想アドレッシングのために、CPUがLinuxカーネルが使用できる機能を提供していることを理解しています。これは、スタックサイズの制限が適用される方法と似ていますか?あるいは、Linuxはスタックサイズを定期的にチェックし、犯罪発生後にsegfaultsを発行しますか?または、いくつかのオプションがありますか?Linuxカーネルはどのようにスタックサイズ制限を実施していますか?

答えて

3

カーネルは仮想メモリのためにこれを制御できます。仮想メモリ(メモリマッピングとも呼ばれます)は基本的に、仮想メモリ領域(ベース+サイズ)のリストと、各プログラムに固有のカーネルが操作できるターゲット物理メモリ領域です。プログラムがこのリストにないアドレスにアクセスしようとすると、例外が発生します。この例外により、カーネルモードにコンテキストが切り替わります。カーネルは障害を検索できます。メモリが有効になると、プログラムは続行されます(スワップとmmapはディスクから読み込まれません)。またはSEGFAULTが生成されます。

スタックサイズ制限を決定するために、カーネルは単純に仮想メモリマップを操作します。

+0

ありがとうございます。これは、メモリの上位8MB(またはスタックサイズ制限)の中の何かが、カーネルによって例外としてマップされますが、その下の領域はSYS_BRK経由で要求されなければならないのでしょうか? –

+0

brk/sbrkを使用してヒープスペースを増やすことができます。マニュアルページは、これが通常データ領域に従うことを指定します。スタックメモリは理論的には任意のメモリ位置に置くことができます。多くのカーネルやOSはこれを正確に実行するので、セキュリティ違反のあるソフトウェアを悪用することが難しくなります。 –

関連する問題