VM_MAP_FIND(9) | FreeBSD Kernel Developer's Manual | VM_MAP_FIND(9) |
名称
vm_map_find — マップ内の空き領域を見つけ、オプションで vm_object マップする書式
#include < sys/param.h>#include < vm/vm.h>
#include < vm/vm_map.h>
int
vm_map_find( vm_map_t map, vm_object_t object, vm_ooffset_t offset, vm_offset_t *addr, vm_size_t length, vm_offset_t max_addr, int find_space, vm_prot_t prot, vm_prot_t max, int cow);
解説
vm_map_find() 関数は、与えられた length でターゲット map 中の空き領域を見つけることを試みます。空き領域が見つかるなら、 vm_map_find() は、 vm_map_insert(9) への呼び出しによって object のマッピングを作成します。空き領域が見つけられる場合にだけ、マップを作成するときに、引数 offset, prot, max, と cow は、 vm_map_insert(9) に変更せずに渡されます。
object が NULL でないなら、オブジェクトおける参照カウントは、新しいエントリの原因となるこの関数が呼び出される前に、呼び出し側によって増加されなければなりません。
max_addr が 0 でないなら、それは、マッピングでの上限を指定します。完全に下記の max_addr に存在する、空き領域を見つけることができならいなら、マッピングは、単に成功します。
find_space 引数は、要求された長さの空き領域を検索するとき、使用する戦略を指定します。 VMFS_NO_SPACE 以外のすべての値について、 vm_map_findspace(9) は、開始アドレスで、または上記の *addr で、要求された長さの空き領域を位置付けるために呼び出されます。次の戦略がサポートされます:
- VMFS_NO_SPACE
- マッピングは、与えられたアドレス *addr で要求された長さの空き領域があるなら、単に成功します。
- VMFS_ANY_SPACE
- マッピングは、空き領域がある限り、成功します。
- VMFS_SUPER_SPACE
- マッピングは、スーパページ境界で始まる空き領域がある限り、成功します。 object が NULL でなく、既にスーパページによって裏打ちされているなら、マッピングは、スーパページ境界で始まるものではなく既存のスーパページに相対的に整列する空き領域を要求します。
- VMFS_OPTIMAL_SPACE
- マッピングは、空き領域がある限り、成功します。しかしながら、 object が NULL でなく、既にスーパページによって裏打ちされているなら、この戦略は、既存のスーパページに相対的な整列された空き領域を見つけることを試みます。
- VMFS_ALIGNED_SPACE( n)
- マッピングは、 2^ n 境界で整列される空き地域がある限り、成功します。
実装に関する注
この関数は、 vm_map_lock(9) の呼び出しによって map 上のロックを獲得して、関数が返るまで、それを保持します。空き領域の検索は、アドレス addr から前方へ、最初の適合となるように定義されます。
戻り値
マッピングが成功して作成されたなら、 vm_map_find() 関数は、 KERN_SUCCESS を返します。空間が見つけることができなかったか、または find_space が VMFS_NO_SPACE であり、与えられたアドレス addr が既にマップされているなら、 KERN_NO_SPACE が返されます。発見された範囲が結局にせあることが判明するなら、 KERN_INVALID_ADDRESS が返されます。作者
このマニュアルページは、 <bms@spc.org>によって書かれました。September 12, 2013 | FreeBSD |