Linuxカーネルメモリ管理リファレンス

Linuxカーネルメモリ管理リファレンス

Linux Device Driversの本から抜粋したものを理解するのに苦労しています(申し訳ありませんが、この投稿はテキストが多すぎます)。

カーネル(x86アーキテクチャでデフォルト設定)は、ユーザースペースとカーネルの間に4 GBの仮想アドレススペースを分割します。両方のコンテキストで同じマッピングセットが使用されます。一般的な分割では、ユーザースペースに3GB、カーネルスペースに1GBを割り当てます。

わかりました、わかりました。

カーネルのコードとデータ構造はそのスペースに収まるべきですが、カーネルアドレス空間を最も消費するのは、物理メモリの仮想マッピングです。

どういう意味ですか?カーネルのコードとデータ構造も「物理アドレス空間にマップされた仮想メモリ」にありませんか?これらのコードとデータ構造はどこに保存されていますか?

それとも、ドライバ、IPC、またはその他の手段を介して操作するカーネルに関連付けられていない任意のデータをマッピングするために、カーネルに仮想アドレス空間が必要ですか?

カーネルは、カーネルアドレス空間にマップされていないメモリでは直接動作できません。つまり、カーネルには直接アクセス可能なメモリを格納するために独自の仮想アドレスが必要です。

これは本当ですか?カーネルがプロセスコンテキスト(システムコール処理)で実行されている場合、プロセスのページテーブルは引き続きロードされますが、なぜカーネルはユーザーモードのプロセスメモリを直接読み取ることができないのですか?

したがって、カーネルが長年処理できる物理メモリの最大量は、カーネルコード自体に必要なスペースを引いたカーネルの仮想アドレス空間部分にマッピングできる量でした。

いいですね。私が引用文#2を正しく理解したならば、この言葉が理解されます。

したがって、x86 ベースの Linux システムでは、最大 1 GB 未満の物理メモリを使用できます。

????完全に非論理的なようです。なぜ4GBのメモリを使用し、必要に応じて他のものをカーネルで利用可能な1GBにマップできないのですか? 〜1GBのカーネルスペースしかないと、システムが4GBで実行できないことを意味するのはなぜですか?一度にマッピングする必要はありません。

ベストアンサー1

なぜ4GBのメモリが利用できず、必要に応じて他のものをカーネルで利用可能な1GBにマップできないのですか?

これはHIGHMEM、直接マッピングに適していないメモリに対して設定オプションが実行するアクションです。ただし、これはメモリ内の任意の場所にアクセスする必要がある場合に問題になります。簡単に毎回マッピングを設定せずに直接指すことができれば可能です。これには、常にすべての物理メモリにマップされる仮想メモリ領域が必要です。これは、仮想アドレス空間が物理アドレス空間より小さい場合は実行できません。

直接接続もより速く、vm/highmem.txtカーネル文書から説明する:

一時マッピングを作成するためのコストはかなり高くなる可能性があります。アーキテクチャは、コアのページテーブル、データTLB、および/またはMMUレジスタを操作する必要があります。

もちろん、ユーザー空間マップを介して実行中のプロセスのメモリにアクセスでき、他のプロセスのメモリにアクセスすることを避けることもできます。ただし、ページキャッシュなどの大規模なカーネルデータ構造がある場合は、すべてのメモリが利用可能であればよいでしょう。

全体的な内容は少しです。銀行の切り替え、これはDOS時代に16ビットシステムと386/486システムで使用されていました(ヒメムシステム)。私はその時もこのようなメモリにアクセスするのが特に好きではなかったと思います。これは、物理メモリの複数の領域を同時に「開く」必要がある場合、状況がかなり難しくなるためです。 32ビットシステムに進化した後、64ビットシステムに進化してこの問題を解決しました。

おすすめ記事