Linuxプロセスの仮想メモリ空​​間のカーネル部分を持つ用途は何ですか?

Linuxプロセスの仮想メモリ空​​間のカーネル部分を持つ用途は何ですか?

私は同様の質問を見つけましたが、まだ私の質問に答えていません。 すべてのプロセスの仮想アドレス空間が「カーネル」部分に同じ内容を持っていますか?

  1. まず、この部分にユーザープロセスがアクセスできないことを考えると、アクセスしようとするとエラーが出るようですが、なぜこの部分をユーザープロセス仮想空間に含めるのでしょうか。この部分が重要で便利な実際のシナリオを教えてください。

  2. また、1つの質問は、私は常にメモリのカーネル部分が動的であると考えていました。これは本当ですか?もしそうなら、オペレーティングシステムはプロセス仮想空間でカーネルのサイズをどのように決定しますか?

  3. 物理メモリのカーネルが大きくなったり変更されたりすると、すべてのプロセスの仮想メモリのカーネル部分に同じ効果がありますか?この仮想コアと実際のコア間のマッピングは一対一のマッピングですか?

ここに画像の説明を入力してください

ベストアンサー1

  1. カーネルマッピングは、ユーザープロセスの目的ではなく、主にカーネルの目的で存在します。 CPUの観点からは、リニアアドレスにマップされていない物理メモリアドレスは存在しない可能性があります。ただし、CPUはカーネルを呼び出せる必要があります。サービス割り込み、例外処理...また、ユーザープロセスがシステムコールを実行するときにカーネルを呼び出すことができる必要があります(これを行う方法はいくつかあります)。詳細については説明しません。)ほとんどの(すべてではありません)アーキテクチャでは、これはページテーブルを切り替える機会なしに発生します。例をご覧ください。SYSENTER。したがって、少なくともカーネルのエントリポイントは常に現在のアドレス空間にマップする必要があります。

  2. コア分配する動的ですが、アドレス空間はそうではありません。 32ビットx86では、図に示す3/1 GiB分割などのさまざまな分割を使用できます。 64ビットx86では、アドレス空間の上半分がカーネル用に予約されています。メモリマップカーネル文書から)。亀裂は移動できません。 (ライブラリはユーザー空間にロードされます。カーネルモジュールはカーネル空間にロードされますが、これはアドレス空間分割ではなく割り当てのみを変更します。)

  3. ユーザーモードでは、カーネルはすべてのプロセスで共有されるマップを持ちます。カーネル側のページマッピングが変更されると、変更はどこにでも反映されます。

    KPTI が有効な場合、カーネルにはユーザー空間コードの実行時に公開されない独自のプライベートマッピングがあるため、KPTI には 2 つのマッピングがあり、カーネルのプライベートマッピングに対する変更はユーザー空間に表示されません。これがKPTIの重要性です。 )。

    カーネルメモリマップは常にすべてのコアをマッピングしますが(KPTIを実行するときにカーネルモードで)、必ずしも1対1である必要はありません。たとえば、64ビットx86は物理メモリの完全なマッピングを含むため、すべてのコアが物理的にアドレスは少なくとも2回マッピングされます。

おすすめ記事