はじめに:Linux
初めてソースコードを読んだときは、ハイエンドメモリの役割が気になりましたが、2 回目に読むときはデフォルトでオプションをオフにしてもう一度読みましたCONFIG_HIGHMEM
。インターネット上の記事でもハイエンドメモリの定義はそう呼ばれているだけで3G+896MB~4G
、わかりやすい説明はありません。
膨大なLinux
ソースコードの説明は、各種ビデオ解説でも、各種書籍でも、単に各種モジュールに分割されているだけで、各モジュールがどのようにつながっているかについてはほとんど情報がありません。自分自身で理解し、いわゆる理解を得るために実践する必要があります。
ハイエンドメモリのモジュール理解
デフォルトでは、4G+
このブロックはハイエンド メモリとして認識されます。
4G+ ハイエンド メモリが VA または PA なのはなぜですか?
VA
、ここでは4G+
仮想アドレスを指します
IA-32
アーキテクチャでは、仮想アドレス空間が1:3
カーネル、1G
つまり3G~4G
(ここではカーネルは0~3G
プロセスのアドレス空間を気にしないことに注意してください)32
とアドレス行に従って分割されることがわかっています。CPU
命令を分析するとき、仮想アドレス空間は常に前のアドレスに従ってのみ分割できます4G
が、コアは中央と上部を占めます。1G
カーネルの仮想メモリが (プロセスのアドレス空間に関係なく) 物理メモリを直接マッピングすると仮定すると1G
、このときにマッピングされる物理アドレスの最大範囲は次のようになります。物理メモリがこれより大きい場合はどうなります0~1G
か1G
? (最大仮想アドレス空間は のみであり4G
、それ以上追加することはできません)
次に、ハイエンド メモリのコンセプトが登場します。物理メモリ以上の物理メモリはすべて1G
ハイエンドメモリに分けられますが、具体的にはどうやって使うのでしょうか?
buddy system
ソース コードからは、カーネルの初期化プロセス中に、パートナー システム ( )、メモリ ビットマップおよびメモリ ページ マップ ( struct page
) が初期化され、ハイエンド メモリを含むすべての物理メモリの割り当てが管理されることがわかります。
ハイエンド メモリの 3 つのマッピング方法については、ここでは説明しません。3G+896MB~4G
仮想アドレスのペアにアクセスする場合、一時マッピングまたはページ テーブル テクノロジを使用して、パートナー システムから物理ページを取得し、マッピングを確立します。
要約すると、仮想アドレス空間は変化せず、物理メモリは可変です。
スターライトは旅をしている人々のことなど気にしていません、そして、そうする意欲のある人々には時間は報われます。