私はこの質問に出くわしました:
Linuxプロセスの仮想メモリ空間にカーネル部分を含めることの用途は何ですか?
回答と回答へのコメントに基づいて:
カーネルメモリマップには、すべての物理メモリの直接マッピングが含まれているため、メモリ内のすべてのものがそこに表示されます。また、カーネル、モジュールなどの個別のマッピングが含まれているため、カーネルを含む物理アドレスは、少なくとも2つの異なるマッピングに表示されます。
これは本当ですか?これに関するソースや参照が見つかりませんでした。なぜ、物理メモリ全体のマップが含まれているのに、カーネルモジュールの個別のマッピングがあるのでしょうか。それは冗長ではありませんか?
64ビットLinuxのプロセスの仮想メモリのカーネル部分の内部にあるものを簡単に説明できますか?および回答のソースを提供してください!これに関連するものはどの本や紙にも見つからなかったからです。
X86-64でのカーネルのメモリマップは カーネル自体に記載されています です。カーネルマップ
物理メモリの完全なマッピングがあると便利ですが、その関連性は、それが生み出すセキュリティリスクやアドレス空間の負担と比較して議論されています(結果として、物理メモリは実質的にアドレス空間の半分に制限されるため、これが最近の拡張を促しました56ビットアドレスの5レベルページテーブルへ)。
「64ビットのメモリスペースは大きいです。あなたはそれがどれほど広大で、巨大で、驚くほど大きいかを信じられないでしょう。つまり、化学者への道のりは遠いと思うかもしれませんが、それは64ビットメモリスペースへのピーナッツにすぎません。」
考えをシンプルにしておくのは良いことです。
したがって、ハードウェアの直接マッピングに半分を割り当て、ハードウェアアドレスの1対1のマッピングのみを割り当てることにしました。そして、仮想マッピングの半分。そこに何かを2回入れる方が、そうでないよりも安くなります。他のものにある場合、直接マッピングからものを除外する条件付きコードがあると想像してください。そして、物事がどれほど複雑になるか想像してみてください。すべてが直接マッピングに含まれているわけではないので、必要なものを見つけるために、さらに多くの条件付きコードをシードします。 2回マッピングする方が簡単です。 (これは単純化されすぎている可能性があり、一部の詳細が間違っている可能性がありますが、一般的な考え方は正しいです。)