64bitでのアドレス空間
x86_64環境でのアドレス空間(Kernel 2.6.30)
図1 x86_64でのアドレス空間
ユーザ空間は0x0000000000000000〜0x00007fffffffffff。
カーネル空間は0xffff800000000000以降を使用する。カーネル空間の0xffff880000000000〜は搭載物理メモリの分だけ物理メモリにストレートマップされる。64bit環境では、仮想アドレス空間が広いので物理メモリ全体をストレートマップできるため、LowMemoery/HighMemoryの区別はない。
0xffffc20000000000以降はストレートマップされない領域になる。ここはvmallocで確保した領域などに使われる。
カーネルの.textセグメントは0xffffffff81000000から始まる。
カーネル空間のPageDirectory設定
カーネル空間のPML4テーブルはinit_level4_pgtに設定される。32bit環境ではswapper_pg_dirに設定されていたが異なる。ただし、64bit環境では以下のdefineがされており、swapper_pg_dirがinit_level4_pgtを参照している。
#define swapper_pg_dir init_level4_pgt
arch/x86/kernel/mm/init.c
unsigned long __init_refok init_memory_mapping(unsigned long start,
unsigned long end)
{
:
#else /* CONFIG_X86_64 */
/* 実装メモリ分のストレートマップ作成 */
for (i = 0; i < nr_range; i++)
ret = kernel_physical_mapping_init(mr[i].start, mr[i].end,
mr[i].page_size_mask);
#endif
このあたりは、32bit環境においてはも2.6.11から処理が若干変わっている。