カーネルがユーザープログラム、つまりシステムコールに代わって実行されているときにカーネルスペースが使用されていますか?それとも、すべてのカーネルスレッド(スケジューラなど)のアドレス空間ですか?
それが最初のものである場合、それは通常のユーザープログラムが3GBを超えるメモリを持つことができないことを意味しますか(分割が3GB + 1GBの場合)?また、その場合、カーネルはどのようにハイメモリを使用できますか。1GBのカーネルスペースが論理的にマップされるため、ハイメモリからのページはどの仮想メモリアドレスにマップされますか?
承認された回答:
カーネルがユーザープログラム、つまりシステムコールに代わって実行されているときにカーネルスペースが使用されていますか?それとも、すべてのカーネルスレッド(スケジューラなど)のアドレス空間ですか?
はい、はい。
先に進む前に、メモリについてこれを述べる必要があります。
メモリは2つの異なる領域に分けられます:
- ユーザースペース 、これは通常のユーザープロセスが実行される場所のセットです(つまり、カーネル以外のすべて)。カーネルの役割は、このスペースで実行されているアプリケーションが互いに干渉したり、マシンが混乱したりしないように管理することです。
- カーネルスペース 、カーネルのコードが保存されている場所であり、下で実行されます。
ユーザースペースで実行されているプロセスは、メモリの限られた部分にしかアクセスできませんが、カーネルはすべてのメモリにアクセスできます。ユーザースペースで実行されているプロセスもしない カーネル空間にアクセスできます。ユーザースペースプロセスは、カーネルのごく一部にしかアクセスできません カーネルによって公開されたインターフェースを介して–システムコール 。プロセスがシステムコールを実行すると、ソフトウェア割り込みがカーネルに送信され、カーネルは適切な割り込みハンドラーをディスパッチし、ハンドラーが終了した後も作業を続行します。
カーネルスペースコードには、「カーネルモード」で実行するプロパティがあります。これは、(通常のデスクトップ-x86-コンピューターでは)リング0で実行されるコードを呼び出すものです。 。 通常、x86アーキテクチャには、4つの保護リングがあります 。リング0(カーネルモード)、リング1(仮想マシンのハイパーバイザーまたはドライバーで使用される可能性があります)、リング2(ドライバーで使用される可能性がありますが、それについてはよくわかりません)。リング3は、一般的なアプリケーションが実行されるものです。これは最も特権の少ないリングであり、その上で実行されているアプリケーションは、プロセッサの命令のサブセットにアクセスできます。リング0(カーネルスペース)は最も特権のあるリングであり、マシンのすべての命令にアクセスできます。たとえば、これに対して、「プレーン」アプリケーション(ブラウザなど)はx86アセンブリ命令lgdt
を使用できません グローバル記述子テーブルまたはhlt
をロードします プロセッサを停止します。
それが最初のものである場合、それは通常のユーザープログラムが3GBを超えるメモリを持つことができないことを意味しますか(分割が3GB + 1GBの場合)?また、その場合、カーネルはどのようにハイメモリを使用できますか。1GBのカーネルスペースが論理的にマップされるため、ハイメモリからのページはどの仮想メモリアドレスにマップされますか?
これに対する答えについては、ここでwagによる優れた答えを参照してください
関連:ノーチラスステータスバーの可視性–空き領域をすばやく確認しますか?