プロセス制御ブロック
カーネル内のコードは頻繁に現在走行中のプロセスのプロセス制御ブロック (PCB) にアクセスする。通常、グローバルなポインタ変数で現在のプロセスのPCB(カレントPCB)を指す。また、カーネル内のシステムコール処理はプロセス毎に行われるものであるため、カーネルスタックはプロセス毎に必要となる。これを簡単に管理するため、PCBとカーネルスタックを一体化させることがある。
グローバル変数を使うと間接アクセスになるため性能的に不利となる。そこで性能向上のためにカレントPCBを固定の仮想アドレスにマッピングすることがある。例えば、MIPSアーキテクチャでは 0番地の前後へのアクセスについてゼロレジスタ(内容が常にゼロ)をポインタのように扱って非常に効率的なコードを書くことができる。これを利用して仮想空間の最も大きなアドレス(32ビットならば 0xFFFFFFFF)付近にPCBとカーネルスタックをマッピングすることが多い(負のオフセットとゼロレジスタでPCBにアクセス可能)。
一般にカーネル内ではプロセス毎にスタックがあるため、そのサイズはユーザ空間のコールスタックほど大きくできない。そのため、カーネル内のコードはスタック上に大きな局所変数領域を持たないよう注意しなければならないし、再帰呼び出しも避けなければならない。
マルチプロセッシングでは、各プロセッサがそれぞれ異なるプロセスを実行するため、カレントPCBもプロセッサ毎に存在する。