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

名称

sf_bufメモリページをマップする一時的なカーネルアドレス空間を管理する

書式

#include < sys/sf_buf.h>

struct sf_buf *
sf_buf_alloc( struct vm_page *m, int flags);

void
sf_buf_free( struct sf_buf *sf);

vm_offset_t
sf_buf_kva( struct sf_buf *sf);

struct vm_page *
sf_buf_page( struct sf_buf *sf);

解説

sf_buf インタフェース、歴史的な sendfile(2) バッファインタフェースによって、カーネルサブシステムは、物理的なメモリページの一時的なカーネルアドレス空間マッピングを管理できます。 (すべての物理的なページがカーネルアドレス空間で常に目に見えることができる) ダイレクトメモリマップ領域があるシステムで、 struct sf_buf は、ダイレクトマップ領域のアドレスを指します。ダイレクトメモリマップ領域のないシステムでは、 struct sf_buf は、 struct sf_buf の生存期間の一時的なカーネルアドレス空間マッピングを管理します。

物理的なメモリページのための struct sf_buf を割り付けるために sf_buf_alloc() を呼び出します。 sf_buf_alloc() は、物理的なメモリに存在するページを準備する責任はありません。呼び出し側は、ページを既に準備するべきです、すなわち、 vm_page_wire(9) を呼び出すことによってです。いくつかのフラグが、 sf_buf_alloc() に渡されます:

SFB_CATCH
struct sf_buf が利用可能になるまでシグナルのウェートを受信するなら、 sf_buf_alloc() は、アボートし、 NULL 返します。
SFB_NOWAIT
sf_buf_alloc() は、 struct sf_buf が直ちに利用可能でないなら、スリープしないで、 NULL を返します。
SFB_CPUPRIVATE
sf_buf_alloc() は、同時に単一の CPU でアクセスされるだけであるマッピングのために不要な TLB シュートダウン (shootdown) を避けて、現在の CPU で有効な一時的なマッピングのみを準備します。呼び出し側は、仮想アドレスへのアクセスが恐らく sched_pin() を使用することによって、 sf_buf_alloc() が呼び出された CPU だけで起こることを保証しなければなりません。

ページのカーネルでマップされたアドレスを返すために sf_buf_kva() を呼び出します。

sf_buf_alloc() に渡された元もとのページへのポインタを返すために sf_buf_page() を呼び出します。

struct sf_buf 参照を解放するために sf_buf_free() を呼び出します。呼び出し側は、物理的なページで以前に取得した配線を解放する責任があります。 sf_buf_free() は、ページ自体ではなく、一時的なカーネルアドレス空間マッピングだけを解放します。

このインタフェースの使用法は、0 コピーのソケット I/O でのような、ユーザメモリからの借りられたページのマッピング管理、または sendfile(2) のための mbuf 外部記憶域によって参照されたバッファキャッシュからのメモリのページを含んでいます。

作者

struct sf_buf API は、 Alan L. Cox によって設計されて、実装されました。このマニュアルページは Robert N. M. Watson によって書かれました。
January 28, 2007 FreeBSD