EN JA
VM_MAP(9)
VM_MAP(9) FreeBSD Kernel Developer's Manual VM_MAP(9)

名称

vm_map仮想メモリサブシステムの仮想アドレス空間部分

書式

#include < sys/param.h>
#include < vm/vm.h>
#include < vm/vm_map.h>

解説

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_offsetmax_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 によって裏打ちされます。

作者

このマニュアルページは、 Bruce M Simpson <bms@spc.org>によって書かれました。
July 9, 2011 FreeBSD