回答:
注:私はx86に最も精通しており、広く文書化されているため、ほとんどx86を参照しています。
x86(および他のほとんどのアーキテクチャー)では、スタックは他のすべてと同様にメモリに常駐します。プロセッサは、通常レジスタ(スタックポインタ)に格納されているポインタを介してスタックを操作します。プッシュおよびポップ命令は、スタックポインターの値を変更し、スタックの先頭がどこにあるかを変更します。
ヒープはソフトウェアの抽象化です。名前が示すように、アロケータがスライスしてポインタを渡すRAMの塊にすぎません。物理的には、ヒープはRAMの他の部分とまったく同じように見えます。
ただし、ページングとセグメンテーションはヒープに接線的に関連しています。これらは主にマルチタスクに関係しており、プロセスが明示的に所有していないRAMを変更することはできません。
論理的に言えば、スタックとヒープは通常、単なるメモリです。ただし、実装レベルでは、主にキャッシュから提供されます。ほとんどのシステムでは、キャッシュアルゴリズムを介して動的にそこに到達しますが、キャッシュまたはその他の通常よりも速いメモリでの明示的な位置をサポートするシステム、および特定のデータが優先的に配置される必要があるというヒントを残すことをサポートするシステムもありました。スペースに余裕があります。
低レベルのソフトウェアとコンパイラのコードジェネレーターの設計では、データアクセスの構成を考慮に入れて、一定のキャッシュミスではなく、適切なキャッシュ使用率が得られる可能性が高いと考えています。
一部のプロセッサには、1つの深さの明示的なスタックキャッシュのように機能するリターンアドレスレジスタがあります(例は思い浮かびませんが、いくつかの深いハードウェアスタックを持つものもあります)。