私は同様の質問を見つけましたが、それでも私の質問には答えません すべてのプロセスの仮想アドレス空間は、「カーネル」部分に同じ内容を持っていますか?
まず、ユーザープロセスがこの部分にアクセスできないことを考えると、ユーザーがアクセスしようとするとエラーが発生するのではないでしょうか。ユーザープロセスの仮想空間にこの部分を含めるのはなぜでしょうか。この部分が不可欠で有用であるという現実のシナリオを教えてもらえますか?
また、もう1つの質問は、メモリのカーネル部分は動的であると常に思っていたということです。たとえば、プログラムで動的ライブラリを使用すると、メモリが大きくなる可能性があるので、それは本当ですか?もしそうなら、OSはどのようにしてプロセスの仮想空間にあるカーネルのサイズがどれほど大きいかを判断できますか?
そして、物理メモリ内のカーネルが拡大または変更された場合、すべてのプロセスの仮想メモリのカーネル部分で同じ効果が発生しますか?この仮想カーネルから実際のカーネルへのマッピングは1対1のマッピングですか?
カーネルマッピングは、ユーザープロセスではなく、主にカーネルの目的のために存在します。 CPUの観点からは、リニアアドレスとしてマップされていない物理メモリアドレスも存在しない可能性があります。しかし、CPUはカーネルを呼び出すことができる必要があります:割り込みを処理するため、例外を処理するため...ユーザープロセスがシステムコールを発行するときに、カーネルを呼び出すことができる必要もあります(これにはさまざまな方法があります)詳細については説明しませんので)。すべてではないにしてもほとんどのアーキテクチャでは、これはページテーブルを切り替える機会なしに起こります—たとえば SYSENTER
を参照してください。したがって、最低限、カーネルへのエントリポイントは、常に現在のアドレス空間にマップする必要があります。
カーネル割り当ては動的ですが、アドレス空間は動的ではありません。 32ビットx86では、図に3/1 GiB splitと表示されています。64ビットx86では、アドレス空間の上半分は、カーネル(カーネルのドキュメントの メモリマップ を参照)。その分割は移動できません。(ライブラリはユーザースペースに読み込まれます。カーネルモジュールはカーネルスペースに読み込まれますが、アドレス空間分割ではなく、割り当て。)
ユーザーモードでは、カーネルのマッピングが1つあり、すべてのプロセスで共有されます。カーネル側のページマッピングが変更されると、その変更はどこにでも反映されます。
KPTIが有効な場合、カーネルには独自のプライベートマッピングがあり、ユーザー空間コードの実行時に公開されません。したがって、KPTIには2つのマッピングがあり、kernel-privateへの変更はユーザー空間には表示されません(これはKPTIの全体的なポイントです)。
カーネルメモリマップは常にすべてのカーネルをマップします(KPTIを実行している場合はカーネルモード)。ただし、必ずしも1対1である必要はありません。たとえば、64ビットx86では、物理メモリのフルマップが含まれているため、すべてのカーネル物理アドレスは少なくとも2回マッピングされます。
カーネルの定義によるより一般的な理解のためのもう1つの小さなヒントは、管理サービスを実行し、ユーザーアプリケーションにサービスを提供するために、常にアクティブである必要があります。このアクティブ性は、すべてのプロセスでカーネルを論理的にバインドすることによって実質的に達成されます。
これは理にかなっています。シングルプロセッサマシン環境で複数のプロセスが実行されていることを考慮してくださいまた、プロセス構造にカーネルマッピングが含まれていないことも考慮してください。プロセスの実行がスケジュールされるとプロセッサのみが存在するため、CPUがプロセスによって占有されているため、カーネルがアクティブではないことは間違いありません。さらに、プロセスで使用できるカーネルのマッピングがないと想定しています。論理的な問題は、カーネルがサービスをどのように実行するかということです。ソリューションはすべてのプロセスにマッピングされます。
そのように私はすべての人間が作成者へのマッピングを持っていると思います。