プロテクトモードのオペレーティングシステム(WindowsやLinuxなど)を使用する場合、各プロセスには、特定のプロセスで使用できるメモリページがたくさんあります。より多くのメモリが必要な場合は、より多くのページをページングできます。
通常、プロセスは与えられたメモリを2つの部分に分割します。1つはヒープで、もう1つはスタックです。スタックの最下部は、armのスタックポインターr13およびx86のespによって指定されます。スタックに変数を作成すると、必要な余分なスペースを確保するためにスタックポインタが移動します。これは、アセンブラ命令PUSHによって実行されます。同様に、変数がスコープ外の場合、スタックからPOPされます。
通常、PUSHを使用すると、スタックポインターがデクリメントされ、スタックポインターの値より上の値が「スタック上」に残ります。
メモリの他の部分は、ヒープに使用できます。これは、mallocまたはnewを使用して割り当てることができます。各スレッドには独自のスタックが必要ですが、プロセス内の他のスレッドとヒープを共有する場合があります。
カーネルがスレッドを再スケジュールすると、スタックレジスタが格納され、スタックレジスタが新しいスタックに変更されます。スケジューリングの方法に応じて、プログラムカウンターを保存する必要がある場合とない場合があります。
キャッシュはスタックまたはヒープとは何の関係もありません。これはプロセッサによって管理され、CPUが必要とするデータを手元に置いて、バスがデータをフェッチするのを待つ必要がないようにする方法を提供します。メインメモリにあるものがキャッシュに保存されているものと同じであることを確認するのは、完全にCPU次第です。キャッシュについて本当に心配する必要があるのは、DMAを使用するときだけです。CPUがキャッシュを信頼せず、実際にメインメモリからデータをフェッチするようにするには、キャッシュを手動でフラッシュまたは同期する必要があります。