64ビットLinuxカーネルでは、カーネルによってどのくらいのメモリが連続してマッピングされますか?
私はRobertLoveのLinuxKernelDevelopmentやその他のソースを調べました。そして、32ビットx86システムでは、カーネルが仮想アドレス空間の上位1 GBを所有し、そのうち最大896 MBが物理メモリ(ZONE_NORMALと呼ばれる)に連続してマッピングされ、残りは残りの128MB空間にマッピングされると記載されています。必要に応じて、連続していない場合があります(ZONE_HIGHMEM)。
64ビットでは、十分な仮想アドレス空間がないという問題が解消されます。そして、メモリマップは次のように記述されます。
0xffffffffffffffff +-----------+
| |
| | Kernelspace
| |
0xffff800000000000 +-----------+
| |
| |
| hole |
| |
| |
0x00007fffffffffff +-----------+
| |
| | Userspace
| |
0x0000000000000000 +———————————+
ただし、このマップでは、(ZONE_NORMALで定義されているように)物理的に隣接するために必要なカーネルスペースの量は明確ではありません。必要に応じてマッピングされる量。
64ビットカーネルのZONE_HIGHMEMは常に0ですか?すべてのメモリは仮想アドレス空間の範囲内にあるのでしょうか?
ただし、カーネルの固定連続メモリ(ページング不可)も小さい必要があります。これは、物理メモリのチャンクが他のユーザープロセスで使用できないためです。したがって、カーネルは、必要に応じて、連続している必要のないメモリ(ZONE_HIGHMEMなど)を使用する必要があります。これは、64ビットカーネルでZONE_HIGHMEMが空であることと競合します。
そのため、64ビットカーネルの場合、カーネルスペースのどれだけが物理的に隣接して固定され、どれだけが非連続であるかについて混乱しています。
回答
HIGHMEM
64ビットx86にはありません—にCONFIG_HIGHMEM依存しX86_32ます。
64ビットx86には、物理メモリの2つの固定マッピングがあります。
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未満)および後でロードされるモジュールによってロックされたメモリ。