Windows では、すべてのプロセスのハイ メモリ (0x80000000 または 0xc0000000) がカーネル コード用に予約されています。ユーザー コードはこれらのメモリ領域にアクセスできず、アクセス違反例外がスローされます。
カーネル空間がどのように保護されているか知りたいですか?
メモリセグメンテーションまたはページング経由ですか?
技術的な説明を聞きたいです。
どうもありがとう、マイケル。
これは簡単なことで、リングやカーネルの動作について話す必要はありません。特定のアドレスで仮想メモリにアクセスするには、そのアドレスをマップする必要があり、オペレーティング システムはそのアドレスにメモリ ページを割り当てる必要があります。これを行う低レベルの winapi 関数が VirtualAlloc() です。オプションのアドレス、最初の引数を取ります。OS は、マップできないアドレスの要求を単純に失敗させます。それ以外の場合は、アドレス空間の最下位 64KB にアドレスをマッピングできないのとまったく同じメカニズムです。
x86 および x64 アーキテクチャについて話していると仮定します。
メモリ保護は、ページング システムを使用して実現されます。x86/x64 CPU の各ページ テーブル エントリには、ユーザー ページかスーパーバイザー ページかを示すビットがあります。スーパーバイザ ページへのアクセスは、CPL<3 で実行されているコードに対してのみ許可されますが、非スーパーバイザ ページへのアクセスは CPL に関係なく可能です。
CPL は、リングと呼ばれることもある「現在の特権レベル」です。Windows は 2 つのリングしか使用しませんが、CPU は 4 を実装します。リング 0 は、Windows が「カーネル モード」と呼ぶものが実行される CPU モードです。リング3は「ユーザーモード」が動作するCPUモードです。CPL=3 で実行されるコードはスーパバイザ ページにアクセスできないため、これがメモリ保護の実装方法です。
ARM の答えはおそらく似ていますが、異なります。