CPU には、OS がリソースを保護するのを支援するメカニズムがあります。x86チップの例を使用しましょう。などの「汎用」レジスタeax
は保護されません。しかし、 などのデバッグ レジスタはDR0
ありません。
OS が実行されているとき、CPU は「リング 0」または総称して「システム モード」と呼ばれるもので実行されています。プログラムは、x86 で「リング 3」、つまり「ユーザー モード」と呼ばれるものを実行しています。
実行がリング 3 からリング 0 に変わると (その方法については後で詳しく説明します)、CPU はユーザー モードの保護を解除します。これにより、OS はデバッグ レジスタを変更できます。
ただし、OS によって保護される主なものは、メモリの場所とデバイスの入出力です。このため、命令in
とout
命令は特権が与えられており、リング 3 では実行されない場合があります。
メモリは TLB によって保護されます。TLB は、ユーザー モード プロセスから見える仮想メモリ (VM) アドレス レンジャーの定義にも使用されます。各プロセスから見えるメモリ空間を制御するのはこのテーブルです。TLB 自体は、リング 0 オペレーティング システムのみが変更できるメモリに格納されます。同様に、割り込みベクトルとメモリにマップされたデバイスは、OS のみがアクセスできるメモリ範囲に割り当てられます。
たとえば を実行すると、mov [eax], 3
eax が参照するアドレスが TLB で検索されます。CPU は、TLB 内のアクセス ビット (NOEXEC ビットなど) から、命令が合法的にメモリにアクセスしているかどうかを判断します。
プロセスが OS スケジューラによってスワップされると、そのような汎用レジスタeax
は、OS によって維持されるスレッドごとのメモリ領域に保存されます。切り替え先のスレッドは、以前のレジスタ値のメモリ イメージから復元されます。
OS がすべての機械語命令に干渉すると、コンピューターは信じられないほど遅くなります。特に、汎用レジスタへのアクセスは可能な限り高速に維持する必要があります。メモリ アクセスの TLB ルックアップはキャッシュされ、メモリ アクセス自体より遅くはありません。
リング 3 からリング 0 に切り替えるために、ソフトウェア割り込みが生成されます。これが「システムコール」割り込みです。割り込みはリング 0 で実行され、OS によって最初のプロセスが開始される前に構成されます。システム コール割り込みは、制御を OS コードに渡します。実行が割り込みサービス ルーチンから戻ると、CPU はリング 3 に戻ります。