VM_MAP(9) | FreeBSD Kernel Developer's Manual | VM_MAP(9) |
名称
vm_map — 仮想メモリサブシステムの仮想アドレス空間部分解説
vm_map サブシステムは仮想アドレス空間を管理するために使用されます。このセクションはコード中で使用された主なデータ構造について説明しています。struct vm_map はアドレス空間の一般的な表現です。このアドレス空間はユーザプロセスまたはカーネルに属しています。カーネルは実際に、 vm_map_submap(9) 関数を使用して作成された、下位のマップとして維持されるいくつかのマップを使用します。
struct vm_map { struct vm_map_entry header; struct sx lock; struct mtx system_mtx; int nentries; vm_size_t size; u_int timestamp; u_char needs_wakeup; u_char system_map; vm_flags_t flags; vm_map_entry_t root; pmap_t pmap; #define min_offset header.start #define max_offset header.end };
struct vm_map のフィールドは次の通りです:
- header
- struct vm_map_entry オブジェクトの二重にリンクされたリストである、サークルの先頭のノード。各オブジェクトはこのマップのアドレス空間の中で特定の領域を定義します。
- lock
- 構造体に順番にアクセスするために使用されます。
- system_mtx
- マップがシステムマップであるなら使用されるミューテックス。
- nentries
- サークルマップエントリリストの中で使用中のメンバの数。
- size
- 仮想アドレス空間のサイズを指定します。
- timestamp
- 最後のアクセス以後に、マップが変更されているかどうか決定するために使用されます。
- needs_wakeup
- スレッドがマップの中で割り付けを待っているかどうかを示します。システムマップだけで使用されます。
- system_map
- TRUE に設定されれば、マップがシステムマップであることを示します。そうでなければ、それはユーザプロセスに属します。
- flags
- 以下に説明される、マップフラグ。
- root
- マップエントリの速い検索に使用される二分検索ツリーのルートノード。
- pmap
- この仮想マップが関連している基本的な物理マップへのポインタ。
- min_offset
- このマップの最小の vm_offset_t。プログラムは、直接 header.start または header.end を決して使用するべきでなく、代わりに min_offset と max_offset を使用します。
- max_offset
- このマップの最大の vm_offset_t。
1 つの利用可能なマップフラグがあります:
- MAP_WIREFUTURE
- このマップですべての将来のページを接合します。
次のフラグは、マップ内の領域のコピーオンライト (copy-on-write) 特性を指定するために vm_map_find(9) と vm_map_insert(9) に渡すことができます。
- MAP_COPY_ON_WRITE
- マッピングがそう、コピーオンライト (copy-on-write) です。
- MAP_NOFAULT
- マッピングはページフォルトを発生させるべきではありません。
- MAP_PREFAULT
- マッピングは物理メモリにプリフォルト (prefault) されるべきです。
- MAP_PREFAULT_PARTIAL
- マッピングは物理メモリに部分的にプリフォルト (prefault) されるべきです。
- MAP_DISABLE_SYNCER
- 定期的にダーティ (汚い) ページをフラッシュしません。絶対に必要であるときのみに、それらをフラッシュします。
- MAP_DISABLE_COREDUMP
- コアダンプでマッピングを含めません。
- MAP_PREFAULT_MADVISE
- madvise(2) を呼び出すユーザプロセスからの要求を指定します。
- MAP_ACC_CHARGED
- 領域は、どうにかして要求側に請求されます。
- MAP_ACC_NO_CHARGE
- 割り付けられた領域に対して請求しません。
struct vm_map_entry は、領域の一般的な表現です。各エントリによって管理される領域は、以下に説明される union vm_map_object に関連しています。
struct vm_map_entry { struct vm_map_entry *prev; struct vm_map_entry *next; struct vm_map_entry *left; struct vm_map_entry *right; vm_offset_t start; vm_offset_t end; vm_offset_t avail_ssize; vm_size_t adj_free; vm_size_t max_free; union vm_map_object object; vm_ooffset_t offset; vm_eflags_t eflags; /* タスクマップだけで: */ vm_prot_t protection; vm_prot_t max_protection; vm_inherit_t inheritance; int wired_count; vm_pindex_t lastr; };
struct vm_map_entry のフィールドは次の通りです:
- prev
- サークルリストである、二重リンク内の前のノードへのポインタ。
- next
- サークルリストである、二重リンク内の次のノードへのポインタ。
- left
- 二分検索ツリー内の左ノードへのポインタ。
- right
- 二分検索ツリー内の右ノードへのポインタ。
- start
- このエントリの領域の下位のアドレス境界。
- end
- このエントリの領域の上位のアドレス境界。
- avail_ssize
- エントリがプロセススタック用であるなら、どのくらいエントリが増大できるかをを指定します。
- adj_free
- このマップエントリの直後に続く、マップされていないアドレス空間に隣接した空きの量。
- max_free
- このマップエントリのサブツリー内の連続する空き空間の最大の量。
- object
- このエントリが関連している struct vm_map_object へのポインタ。
- offset
- start から前方へマップされる object 中のオフセット。
- eflags
- 以下で説明されたこのエントリに適用されたフラグ。
次の 5 つのメンバは、ユーザプロセスのアドレス空間の一部を形成するエントリだけに有効です:
- protection
- この領域に適用されたメモリプロテクション (保護) ビット。
- max_protection
- 実際にこの領域に適用されているメモリプロテクションのマスク。
- inheritance
- このエントリが fork 処理の間にどのように取り扱われるべきであるかを指定するフラグを含んでいます。
- wired_count
- このエントリが何回物理メモリに接合されたかのカウント。
- lastr
- ページフォルトを引き起こした最後の読み込みのアドレスを含んでいます。
次のフラグは eflags メンバ中のマスクとして、それらを指定することによって、各エントリに適用されます:
- MAP_ENTRY_NOSYNC
- システムは、必要であるときのみ以外に、定期的にこのマップに関連しているデータをフラッシュするべきではありません。
- MAP_ENTRY_IS_SUB_MAP
- 設定されるなら、 object のメンバは下位のマップを指定します。
- MAP_ENTRY_COW
- これがコピーオンライト (copy-on-write) 領域であることを示します。
- MAP_ENTRY_NEEDS_COPY
- コピーオンライト領域がコピーされる必要があることを示します。
- MAP_ENTRY_NOFAULT
- この領域中のアクセスがページフォルトを決して引き起こすべきでないことを指定します。ページフォルトがこの領域中で起こるなら、システムはパニックとなります。
- MAP_ENTRY_USER_WIRED
- この領域がユーザプロセスを代表して接合されたことを示します。
- MAP_ENTRY_BEHAV_NORMAL
- システムはこの領域のためにデフォルトのページングの振る舞いを使用するべきです。
- MAP_ENTRY_BEHAV_SEQUENTIAL
- システムは、フォルトするとき、この領域中の各ページの直前のページの優先順位を下げるべきです。
- MAP_ENTRY_BEHAV_RANDOM
- この領域中のページがランダムにアクセスされるヒントであるか、プリフェッチが有利と思われないか。
- MAP_ENTRY_IN_TRANSITION
- エントリの接合または接合を解くことが進行中であり、他のカーネルスレッドが、構造体のフィールドを変更を試みるべきでないことを示します。
- MAP_ENTRY_NEEDS_WAKEUP
- この領域が利用可能になるのを待つカーネルスレッドがあることを示します。
- MAP_ENTRY_NOCOREDUMP
- 領域はコアダンプに含まれるべきではありません。
inheritance メンバにはタイプ vm_inherit_t があります。これは fork 処理の間にマップエントリのための継承の振る舞いを支配します。次の値は vm_inherit_t のために定義されます:
- VM_INHERIT_SHARE
- エントリに関連しているオブジェクトは、クーロンとしてコピーされ、新しいマップと共有されるべきです。必要なら、新しい struct vm_object が作成されます。
- VM_INHERIT_COPY
- エントリに関連しているオブジェクトは新しいマップにコピーされるべきです。
- VM_INHERIT_NONE
- エントリは、新しいマップにコピーされるべきではありません。
- VM_INHERIT_DEFAULT
- デフォルトの振る舞い VM_INHERIT_COPY を指定します。
union vm_map_object は、 struct vm_map_entry が関連している構造体を指定するために使用されます。
union vm_map_object のフィールドは次の通りです:
union vm_map_object { struct vm_object *vm_object; struct vm_map *sub_map; };
通常、 sub_map メンバは、メモリ範囲が下位のシステムマップによって管理されることを示すために、システムマップによってのみ使用されます。ユーザプロセスマップ中では、各 struct vm_map_entry は、 struct vm_object によって裏打ちされます。
関連項目
pmap(9), vm_map_check_protection(9), vm_map_create(9), vm_map_delete(9), vm_map_entry_resize_free(9), vm_map_find(9), vm_map_findspace(9), vm_map_inherit(9), vm_map_init(9), vm_map_insert(9), vm_map_lock(9), vm_map_lookup(9), vm_map_madvise(9), vm_map_max(9), vm_map_min(9), vm_map_pmap(9), vm_map_protect(9), vm_map_remove(9), vm_map_simplify_entry(9), vm_map_stack(9), vm_map_submap(9), vm_map_sync(9), vm_map_wire(9)作者
このマニュアルページは、 <bms@spc.org>によって書かれました。July 9, 2011 | FreeBSD |