Linux Kernel(2.6)の実装に関するメモ書き

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から処理が若干変わっている。


関連ページ

カーネル空間のメモリマップ



最終更新 2010/12/26 14:49:45 - kztomita
(2010/12/26 14:26:52 作成)
添付ファイル
map64.jpg - kztomita


リンク
最近更新したページ
検索