私はこの質問について考えました。
Linuxプロセスの仮想メモリ空間のカーネル部分を持つ用途は何ですか?
そして答えに対する答えと意見に基づいて:
カーネルメモリマップにはすべての物理メモリの直接マッピングが含まれているため、メモリ内のすべてのエントリがここに表示され、カーネル、モジュールなどの別々のマッピングも含まれるため、カーネルを含む物理アドレスは少なくとも2つの異なるマップに表示されます。
これは本当ですか?ソースまたは参照が見つかりません。物理メモリ全体へのマッピングと別々のカーネルモジュールマッピングが含まれているのはなぜですか?これは重複しませんか?
64ビットLinuxでプロセス仮想メモリのカーネル部分が何であるかを簡単に説明できる人はいますか?そして回答のソースを教えてください!どんな本や論文でもこれに関連する内容が見つからないからです。
答え1
x86-64のカーネルメモリマップは次のとおりです。カーネル自体に文書化されている。カーネルマップ
- ユーザースペース(現在のプロセス)
- PTIデータ構造
- すべての物理メモリ
- さまざまなブロックにあるカーネルのデータ構造には、ASLRの脆弱性があります。
- カーネル自体
- モジュール
物理メモリを完全にマッピングするのは便利ですが、これによって発生するセキュリティリスクとアドレス空間の負担(物理メモリは事実上アドレス空間の半分に制限されるため、最近の拡張が引き起こされます)と比較して関連性は議論の余地があります。 56ビットアドレスを持つレベルページテーブル)。
答え2
「64ビットメモリは膨大です。それがどれほど巨大で、巨大で、信じられないか信じられません。つまり、化学者になるにはまだ遠いと思うかもしれませんが、64ビットメモリとしては大きすぎます。空間的な面ではマイナーな問題に過ぎません。 」
単純に考えることをお勧めします。
したがって、ハードウェアアドレスを1対1にマッピングするハードウェア直接マッピングに半分を割り当てることにしました。半分は仮想マッピングに使用されます。何かを二度捨てるのはやめないより安いです。別の地図上の項目を直接地図から除外するために条件付きコードを使用すると想像してください。状況がどれほど複雑になるかを想像してください。今はすべてが直接マップにないので、あなたが望むものを見つけるためにより多くの条件付きコードをシードします。 2回マッピングする方が簡単です。 (あまりにも単純化されている可能性があり、いくつかの詳細が間違っている可能性がありますが、一般的な考えは正確です。)