スタックについていくつか質問があります。
- スタックはCPUまたはRAMにありますか?
- スタックはOPcodeを実行する場所ですか?
- EIPはCPUまたはRAMにありますか?
スタックは常にRAMにあります。スタックの最上位を指すCPUのレジスタに保持されているスタックポインタがあります。つまり、スタックの最上位にある場所のアドレスです。
スタックは、CPU 内ではなく RAM 内にあります。次の図に示すように、セグメントはスタック専用です。
ウィキから:
スタック領域には、プログラム スタック (LIFO 構造体) が含まれ、通常はメモリの上位部分に配置されます。
どのCPUについて話しているのですか?
コールスタックに使用されるメモリが含まれているものもあれば、コールスタックに使用できるメモリが含まれているものの、OS がコールスタック管理コードを実装する必要があるものもあれば、書き込み可能なメモリがまったく含まれていないものもあります。たとえば、x86 アーキテクチャには、1 つ以上のコード キャッシュとデータ キャッシュが CPU に組み込まれている傾向があります。
一部の CPU または OS は、メモリの特定の領域を実行不可能にする操作を実装しています。たとえば、スタックベースのバッファ オーバーフローを防ぐために、多くの OS はハードウェアおよび/またはソフトウェア ベースのデータ実行防止機能を使用しています。これにより、スタック メモリがコードとして実行されるのを防ぐことができます。そうでないものもあります。x86 CPU データ キャッシュ ラインを使用して、コールスタックと実行されるコードの両方をより高速なメモリに格納することは十分に可能です。
EIPは、IA32 CPU アーキテクチャのレジスタのように聞こえます。IA-32 について言及している場合、はい、それは CPU 操作ですが、多くの OS は RAM との間で切り替えてマルチタスクをエミュレートします。
現代のアーキテクチャでは、スタックは RAM にマップされます。ar C、C++、Pascal などのプログラミング言語は RAM にメモリを割り当てることができます。これはヒープ割り当てと呼ばれ、関数内に存在する他の変数はスタックに割り当てられます。これにより、プロセッサとオペレーティング システムは、RAM セグメント内にマップされたスタックを考慮する必要がありました。また、メモリ管理ユニットを備えたプロセッサの場合、これは RAM のどこにでもあります。ただし、インテル 8080 には、スタックからの読み取り/書き込みを示す状態ビットがあったため、スタックを RAM から物理的に分離して実装できました。そのようなマシンが実装されているかどうかはわかりませんが、状況を考えてみてください。C ポインタが指すメモリはヒープかスタックかということです。スタック分離が一般的になれば、最新のプログラミング言語でスタック ポインターとヒープ ポインターを使用する必要があります。