64ビットLinuxカーネルでは、カーネルはどのくらいのメモリを連続的にマップしますか?

64ビットLinuxカーネルでは、カーネルはどのくらいのメモリを連続的にマップしますか?

私はRobert LoveのLinuxカーネル開発やその他の資料を読んだ。 32ビットx86システムでは、カーネルは仮想アドレス空間の上位1 GBを所有し、最大896 MBは物理メモリ(ZONE_NORMALと呼ばれる)に連続的にマッピングされ、残りは残りの128 MBにマッピングされることがすべての場所で言及されています。必要に応じてスペースを確保でき、連続的ではない可能性があります(ZONE_HIGHMEM)。

64ビットでは、仮想アドレススペースが不足している問題は排除されます。メモリマップは次のように記述されます。

0xffffffffffffffff  +-----------+
                    |           |
                    |           | Kernelspace
                    |           |
0xffff800000000000  +-----------+
                    |           |
                    |           |
                    |   hole    |
                    |           |
                    |           |
0x00007fffffffffff  +-----------+
                    |           |
                    |           |  Userspace
                    |           |
0x0000000000000000  +———————————+

ただし、このマップでは(ZONE_NORMALで定義されているように)物理的に連続するためにどのくらいのカーネルスペースが必要かは不明です。そして必要なだけ地図を作成してください。

64ビットカーネルでは、ZONE_HIGHMEMは常に0ですか?すべてのメモリが仮想アドレス空間の範囲内にあるので?

ただし、カーネルの固定された連続メモリ(ページング不可)も小さくする必要があります。これは、物理メモリブロックは他のユーザープロセスでは決して使用できないためです。したがって、カーネルは必要に応じて連続する必要のないメモリ(ZONE_HIGHMEMなど)を使用する必要があります。これは、64ビットカーネルでZONE_HIGHMEMが空であることと競合します。

そのため、カーネル空間のうち物理的に連続的に固定された空間がどれくらいになるのか、64ビットカーネルの場合、非連続的な空間がどれくらいになるのか混乱します。

答え1

HIGHMEM64ビットx86では使用できません -CONFIG_HIGHMEMに依存するX86_32

物理メモリには2つの固定マッピングがあります。64ビットx86から:

ffff888000000000 | -119.5  TB | ffffc87fffffffff |   64 TB | direct mapping of all physical memory (page_offset_base)

そして始まる地域は

ffffffff80000000 |   -2    GB | ffffffff9fffffff |  512 MB | kernel text mapping, mapped to physical address 0

(負のアドレスはアドレス空間の終わりのオフセットです.)

私が知る限り、後者はあなたが思うように動作し、起動中に表示される「メモリ」行を見ると非常に小さい傾向があります。

Memory: 20144992K/20660008K available (14339K kernel code, 2406K rwdata, 8340K rodata, 2488K init, 5116K bss, 515016K reserved, 0K cma-reserved)

(30MiBの直下)および後でロードされたモジュールによってロックされたすべてのメモリ。

関連情報