現代のコンピュータのオペレーティングシステムは通常、仮想メモリを使用して、ユーザー空間とカーネル空間と呼ばれる、単一のアドレス空間の別々のアドレス空間または領域を提供します。[ 1 ] [ a ]この分離は主に、悪意のあるまたは誤ったソフトウェアの動作からメモリとハードウェアを保護します。
カーネル空間は、特権を持つオペレーティングシステムカーネル、カーネル拡張機能、およびほとんどのデバイスドライバを実行するために厳密に確保されています。一方、ユーザー空間は、アプリケーションソフトウェア、デーモン、および一部のドライバが実行されるメモリ領域であり、通常はプロセスごとに1つのアドレス空間が割り当てられます。
ユーザー空間を標的とする攻撃は、俗に「ユーザーランド攻撃」と呼ばれます。
ユーザー空間(またはユーザーランド)という用語は、オペレーティングシステムのカーネルの外で実行されるすべてのコードを指します。[ 2 ]ユーザー空間は通常、オペレーティングシステムがカーネルとやり取りするために使用するさまざまなプログラムとライブラリを指します。入出力を実行するソフトウェア、ファイルシステムオブジェクトを操作するソフトウェア、アプリケーションソフトウェアなどです。
ユーザー空間の各プロセスは通常、独自の仮想メモリ空間で実行され、明示的に許可されない限り、他のプロセスのメモリにアクセスすることはできません。これは、今日の主流のオペレーティングシステムにおけるメモリ保護の基盤であり、特権分離の構成要素でもあります。効率的な仮想マシンを構築するために、別のユーザーモードを使用することもできます(PopekとGoldbergの仮想化要件を参照)。十分な特権があれば、プロセスはカーネルに、他のプロセスのメモリ空間の一部を自身のメモリ空間にマッピングするように要求できます。これは、デバッガの場合と同様です。プログラムは、他のプロセスと共有メモリ領域を要求することもできますが、プロセス間通信を可能にするための他の手法も利用可能です。
カーネルモードとは別にユーザーモードを実装する最も一般的な方法は、オペレーティングシステムの保護リングを用いることです。保護リングは、 CPUモードを使用して実装されます。通常、カーネル空間のプログラムはカーネルモード(スーパーバイザモードとも呼ばれる)で実行され、ユーザー空間の標準アプリケーションはユーザーモードで実行されます。
オペレーティングシステムの中には、単一アドレス空間オペレーティングシステムと呼ばれるものがあり、すべてのユーザーモードコードに単一のアドレス空間が割り当てられます。(カーネルモードコードは同じアドレス空間にある場合もあれば、別のアドレス空間にある場合もあります。)一方、プロセスごとのアドレス空間を持つオペレーティングシステムもあり、各ユーザーモードプロセスに個別のアドレス空間が割り当てられます。