Linux カーネルの HIGHMEM について私が読んだほとんどすべての本や記事では、3:1 分割を使用している間、1GB のすべてがカーネルでマッピングに使用できるわけではないと述べています。通常は 896MB 程度で、残りはカーネル データ構造、メモリ マップ、ページ テーブルなどに使用されます。
私の質問は、これらのデータ構造とは正確には何ですか? ページテーブルは通常、ページテーブルアドレスレジスタを介してアクセスされますよね? また、ページテーブルのベースアドレスは、通常、物理アドレスとして格納されます。では、なぜテーブル全体に仮想アドレス空間を予約する必要があるのでしょうか?
同様に、カーネルコード自体がスペースを占有しているという記事を読みました。それは仮想アドレス空間と何の関係がありますか? コードを格納するために消費されるのは物理メモリではありませんか?
そして最後に、これらのデータ構造はなぜ 128MB のスペースを確保しなければならないのでしょうか? カーネルの他の通常のデータ構造のように、必要に応じて 1GB のアドレス空間全体から使用できないのはなぜですか?
LDD3、Professional Linux Kernel Architecture、stack-overflow のいくつかの投稿 ( Why Linux Kernel ZONE_NORMAL is limited to 896 MB?など) と古い LWN articleを調べましたが、同じものに関する特定の情報は見つかりませんでした。