| SHM_MAP(9) | FreeBSD Kernel Developer's Manual | SHM_MAP(9) |
名称
shm_map, shm_unmap — 共有メモリオブジェクトをカーネルのアドレス空間にマップする書式
#include < sys/types.h>#include < sys/mman.h>
int
shm_map( struct file *fp, size_t size, off_t offset, void **memp);
int
shm_unmap( struct file *fp, void *mem, size_t size);
解説
shm_map() と shm_unmap() 関数は、カーネルに共有メモリオブジェクトをマップするための API を提供しています。共有メモリオブジェクトは、 shm_open(2) によって作成されます。次に、これらのオブジェクトを、ファイル記述子を通してカーネルに渡すことができます。それがカーネルにマップされている間、共有メモリオブジェクトを圧縮することができます。これは、カーネルのアドレス空間に結び付けられているあらゆるページを無効にすることを避けるためです。カーネルにマップされる間でも、共有メモリオブジェクトを成長することができます。
上記の要求を強化するために必要とされる計算を単純化するために、この API の呼び出し側は、 shm_unmap() を呼び出すとき、 shm_map() によってマップされたすべての領域をアンマップすることが要求されます。領域の一部分だけをアンマップすることは、許可されていません。
shm_map() 関数は、オープンされたファイル fp に関連した共有メモリオブジェクトを位置付けます。 offset と size によって記述されたオブジェクトの領域をカーネルのアドレス空間にマップします。成功するなら、 *memp は、マップされた領域の始めに設定されます。領域ののためのすべてのページは、成功して返るときに、メモリに結び付けられます。
shm_unmap() 関数は、以前に shm_map() によってマップされた領域をアンマップします。 mem 引数は、 *memp に以前に返された値と一致するべきで、 size 引数は、 shm_map() に渡された値と一致するべきです。
shm_map() は、マッピングの存続期間のためのオープンされたファイル fp で特別の参照を保持していなということに注意してください。代わりに、呼び出しのコードは、将来に領域で shm_unmap() を使用したいなら、これを行うように要求されます。
戻り値
shm_map() と shm_unmap() 関数は、成功すれば、0 を返し、失敗すれば、エラーを返します。使用例
次の関数は、共有メモリオブジェクトのためのファイル記述子を受け付けます。カーネルにオブジェクトの最初の 16 キロバイトをマップし、そのアドレスでいくらかの作業を行ない、次に、返る前にアドレスをアンマップしています。
int
shm_example(int fd)
{
struct file *fp;
void *mem;
int error;
error = fget(curthread, fd, CAP_MMAP, &fp);
if (error)
return (error);
error = shm_map(fp, 16384, 0, &mem);
if (error) {
fdrop(fp, curthread);
return (error);
}
/* 'mem' で何かを行う. */
error = shm_unmap(fp, mem, 16384);
fdrop(fp, curthread);
return (error);
}
エラー
shm_map() 関数は、失敗すると次のエラーを返します:- [ EINVAL]
- オープンされたファイル fp が共有メモリオブジェクトではありません。
- [ EINVAL]
- offset と size によって記述される要求された領域が共有メモリオブジェクトの終りを越えて拡張しています。
- [ ENOMEM]
- 十分なアドレス空間が利用できませんでした。
- [ EACCES]
- 共有メモリオブジェクトが、プロテクションエラーのためにマップすることができませんでした。
- [ EINVAL]
- 共有メモリオブジェクトがいくつかの VM エラーのためにマップすることができませんでした。
shm_unmap() 関数は、失敗すれと次のエラーを返します:
- [ EINVAL]
- オープンされたファイル fp が共有メモリオブジェクトではありません。
- [ EINVAL]
- mem と size によって記述されたアドレスの領域が、有効なアドレス領域ではありません。
- [ EINVAL]
- mem と size によって記述されたアドレス領域がオープンされたファイル fp に関連した共有メモリオブジェクトによって裏打ちされていないか、またはアドレス領域がオブジェクトのすべてのマッピングをカバーしていません。
関連項目
shm_open(2)歴史
この API は、 FreeBSD 10.0 ではじめて導入されました。| December 14, 2011 | FreeBSD |