いくつかのUnix教科書を見てきましたが、プロセスのスタック領域が何であるかはっきりわかりません。誰でもこれを説明したり、いくつかの参考資料を教えてもらえますか?
答え1
ld.so
カーネルがスタックを動的リンカーに渡す場合にのみ、スタックを明確に表示できます。あなたは一つを見つけることができます基本画像はこちら。これは、Cプログラムの伝統的な3つのパラメータを示していますargc
。argv
envp
int main(int argc, char **argv, char **envp)
この見解はやや単純です。一つELF 補助ベクトルがスタックに存在します。、また多くの情報を渡しました。ld.so
を実行した後、ld.so
libcランタイムが介入して状況を複雑にします。 C ++コンストラクタを実行でき、あらゆる種類の奇妙なものがスタックに積み重ねられます。これは、プログラムがどのようにコンパイルされたかによって異なります。単純なCプログラムであっても、以下に基づいてさまざまなタスクを実行できます。任意の図書館それら次にコンパイル。
答え2
これウィキペディア記事とても簡潔です。 Google で「スタックとヒープ」を検索すると、通常、互いに関連して説明されているコンテンツの多くを見つけることができます。
プログラミングをしない限り、これを理解することは特に有用でも重要ではありません。もしそうなら、ほとんどの人がスタックの意味に最初に触れる場所の1つはWRTです。再帰的着信、これに関連する詳細なウィキペディア記事コールスタック。呼び出しスタックは「プロセスのスタック領域」を占め、入れ子または再帰関数呼び出しに関するデータは互いに「スタック」され、関数呼び出しに関するローカルデータを保持する。後入選出ソート。
直接メモリアドレッシングを許可する言語(C / C ++など)でプログラミングを行ったことがない場合は、メモリがマップメモリ領域をどのようにアドレッシングするかを理解することが重要です。
答え3
プログラムは通常、関数パラメーターをスタックにプッシュし、asm CALLコマンドを使用して関数を呼び出します。このコマンドは戻りアドレスをスタックにプッシュするため、RETコマンドが後でポップして返す場所を知ることができます。さらに、関数は通常、ローカル変数をスタックに配置します。呼び出し関数は、使用中のすべてのレジスタを呼び出し前にスタックにプッシュできるため、呼び出された関数がそのレジスタを別の目的に使用した後にそのレジスタをポップできます。
関数Aが関数Bを呼び出すスタックの単語を視覚的に表現すると、次のようになります。
local1
arg1
functionA+12
local1
local2
functionAにはローカル変数があり、パラメータをfunctionBに渡し、戻りアドレス(functionAの開始後12バイト)を格納します。次に、functionB は独自のローカル変数を 2 つスタックに入れます。 functionBがfunctionCを呼び出すと、スタックは拡大し続け、関数が返されると再び減少します。