25

スタックについていくつか質問があります。

  1. スタックはCPUまたはRAMにありますか?
  2. スタックはOPcodeを実行する場所ですか?
  3. EIPはCPUまたはRAMにありますか?
4

4 に答える 4

54

スタックは常にRAMにあります。スタックの最上位を指すCPUのレジスタに保持されているスタックポインタがあります。つまり、スタックの最上位にある場所のアドレスです。

于 2013-03-15T13:12:52.310 に答える
14

スタックは、CPU 内ではなく RAM 内にあります。次の図に示すように、セグメントはスタック専用です。

ここに画像の説明を入力

ウィキから:

スタック領域には、プログラム スタック (LIFO 構造体) が含まれ、通常はメモリの上位部分に配置されます。

于 2013-03-15T13:15:24.650 に答える
4

どのCPUについて話しているのですか?

  1. コールスタックに使用されるメモリが含まれているものもあれば、コールスタックに使用できるメモリが含まれているものの、OS がコールスタック管理コードを実装する必要があるものもあれば、書き込み可能なメモリがまったく含まれていないものもあります。たとえば、x86 アーキテクチャには、1 つ以上のコード キャッシュデータ キャッシュが CPU に組み込まれている傾向があります。

  2. 一部の CPU または OS は、メモリの特定の領域を実行不可能にする操作を実装しています。たとえば、スタックベースのバッファ オーバーフローを防ぐために、多くの OS はハードウェアおよび/またはソフトウェア ベースのデータ実行防止機能を使用しています。これにより、スタック メモリがコードとして実行されるのを防ぐことができます。そうでないものもあります。x86 CPU データ キャッシュ ラインを使用して、コールスタックと実行されるコードの両方をより高速なメモリに格納することは十分に可能です。

  3. EIPは、IA32 CPU アーキテクチャのレジスタのように聞こえます。IA-32 について言及している場合、はい、それは CPU 操作ですが、多くの OS は RAM との間で切り替えてマルチタスクをエミュレートします。

于 2013-03-15T13:27:58.093 に答える
0

現代のアーキテクチャでは、スタックは RAM にマップされます。ar C、C++、Pascal などのプログラミング言語は RAM にメモリを割り当てることができます。これはヒープ割り当てと呼ばれ、関数内に存在する他の変数はスタックに割り当てられます。これにより、プロセッサとオペレーティング システムは、RAM セグメント内にマップされたスタックを考慮する必要がありました。また、メモリ管理ユニットを備えたプロセッサの場合、これは RAM のどこにでもあります。ただし、インテル 8080 には、スタックからの読み取り/書き込みを示す状態ビットがあったため、スタックを RAM から物理的に分離して実装できました。そのようなマシンが実装されているかどうかはわかりませんが、状況を考えてみてください。C ポインタが指すメモリはヒープかスタックかということです。スタック分離が一般的になれば、最新のプログラミング言語でスタック ポインターとヒープ ポインターを使用する必要があります。

于 2021-02-19T20:35:33.693 に答える