カーネルがユーザープログラム(システムコールなど)に代わって実行されるときにカーネルスペースが使用されますか?それとも、すべてのカーネルスレッド(スケジューラなど)のアドレス空間ですか?
まず、一般ユーザープログラムが3 GB(3 GB + 1 GBで割った場合)以上のメモリを持つことができないという意味ですか?また、この場合、カーネルは1GBのカーネル空間が論理的にマッピングされるので、高いメモリのページがどの仮想メモリアドレスにマッピングされるかについて、カーネルの高いメモリをどのように使用しますか?
ベストアンサー1
カーネルがユーザープログラム(システムコールなど)に代わって実行されるときにカーネルスペースが使用されますか?それとも、すべてのカーネルスレッド(スケジューラなど)のアドレス空間ですか?
はいはい。
さらに進む前に、記憶についていくつかの言葉を言う必要があります。
記憶は2つの領域に分けられます。
- ユーザースペース、これは通常のユーザープロセス(つまり、カーネルを除くすべてのプロセス)が実行される場所のセットです。カーネルの役割は、この空間で実行されているアプリケーションが互いに干渉せず、マシンに干渉しないように管理することです。
- カーネル空間、カーネルのコードとデータが保存され実行される場所です。
ユーザー空間で実行されるプロセスは、限られたメモリ部分にのみアクセスできますが、カーネルはすべてのメモリにアクセスできます。プロセスはユーザー空間でも実行されます。いいえカーネル空間にアクセスできます。ユーザー空間プロセスはカーネルの小さな部分にのみアクセスカーネルを介して公開されるインターフェース -システムコール。プロセスがシステムコールを実行すると、ソフトウェア割り込みがカーネルに送信され、カーネルは適切な割り込みハンドラをスケジュールし、ハンドラが完了した後にタスクを続行します。
カーネル空間コードには「カーネルモード」で実行される属性があり、これは(通常のデスクトップx86コンピュータで)必要です。リング 0 で実行される呼び出しコード。通常、x86アーキテクチャには4つの保護リングがあります。。リング0(カーネルモード)、リング1(おそらくハイパーバイザーまたはドライバーによって使用されます)、リング2(おそらくドライバーによって使用されますがわかりません)。リング3は、一般的なアプリケーションが実行される環境です。実行中のアプリケーションがプロセッサ命令のサブセットにアクセスできる最小特権リング。リング0(カーネルスペース)は最も特権的なリングであり、すべての機械命令にアクセスできます。たとえば、「一般」アプリケーション(ブラウザなど)は、x86アセンブリコマンドを使用してグローバル記述子lgdt
テーブルをロードできず、hlt
プロセッサを停止することもできません。
まず、一般ユーザープログラムが3 GB(3 GB + 1 GBで割った場合)以上のメモリを持つことができないという意味ですか?また、この場合、カーネルは1GBのカーネル空間が論理的にマッピングされるので、高いメモリのページがどの仮想メモリアドレスにマッピングされるかについて、カーネルの高いメモリをどのように使用しますか?
この質問に対する回答については、以下をご覧ください。wagの素晴らしい答え到着Linuxでは、高メモリと低メモリとは何ですか?。