日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
UIO(9) FreeBSD カーネル開発者マニュアル UIO(9) 名称 uio, uiomove, uiomove_frombuf, uiomove_nofault -- デバイスドライバ I/O ルーチン 書式 #include <sys/types.h> #include <sys/uio.h> struct uio { struct iovec *uio_iov; /* 分散/集中 (scatter/gather) リスト */ int uio_iovcnt; /* 分散/集中リストの長さ */ off_t uio_offset; /* タケットオブジェクトの オフセット */ ssize_t uio_resid; /* コピーする残りのバイト */ enum uio_seg uio_segflg; /* アドレス空間 */ enum uio_rw uio_rw; /* 操作 */ struct thread *uio_td; /* 所有者 */ }; int uiomove(void *buf, int howmuch, struct uio *uiop); int uiomove_frombuf(void *buf, int howmuch, struct uio *uiop); int uiomove_nofault(void *buf, int howmuch, struct uio *uiop); 解説 関数 uiomove(), uiomove_frombuf() と uiomove_nofault() は、場合によりユー ザ/カーネル空間の境界に渡るかもしれないバッファと I/O ベクトルの間のデー タを転送するために使用されます。 キャラクタデバイスドライバに渡された、あらゆる read(2), write(2), readv(2) または writev(2) の結果として、適切なドライバ d_read または d_write エントリは、渡されている struct uio へのポインタで呼び出されま す。転送要求は、この構造体でエンコードされます。ドライバ、それ自体は、こ の構造体のデータを取得するために uiomove() または uiomove_nofault() を使 用するべきです。 uio 構造体のフィールドは、次の通りです: uio_iov 処理される I/O ベクトルの配列。分散/集中 (scatter/gather) I/O の場合に、これは、2 つ以上のベクトルとなります。 uio_iovcnt 存在する I/O ベクトルの数。 uio_offset デバイスへのオフセット。 uio_resid 転送の後に更新された、処理するバイトの残りの数。 uio_segflg 次のフラグの 1 つです: UIO_USERSPACE プロセスのアドレス空間への I/O ベクトルポイン ト。 UIO_SYSSPACE カーネルアドレス空間への I/O ベクトルポイン ト。 UIO_NOCOPY 既にオブジェクトがあれば、コピーしません。 uio_rw UIO_READ または UIO_WRITE のいずれかである、要求された転送の 方向。 uio_td 関連するスレッドのための struct thread へのポインタ。転送がプ ロセスのアドレス空間から/へ行われることになっていることを、 uio_segflg が示すなら、使用されます。 関数 uiomove_nofault() は、バッファと I/O ベクトルがページフォルトせず に、アクセス可能であることを必要とします。発信元と宛先アドレスは、それぞ れ読み込みと書き込みアクセスのために物理的にマップされなければなりませ ん、そして、発信元も宛先アドレスもページ可能でないかもしれません。した がって、獲得された仮想記憶システムがロックまたはスリープが禁止されている コンテキストから関数 uiomove_nofault() を呼び出すことができます。 uiomove_frombuf() 関数は、メモリの既存のバッファ内に完全に含まれている データを供給するドライバのための uiomove() のまわりの便利なラッパです。そ れは、要求がバッファと部分的に重複しているとき、短い転送を処理して、既存 のバッファのサイズに対して uio_offset と uio_resid 値を有効にします。 uio_offset バッファサイズより大きいか、または等しいとき、結果は、EOF を効 果的にシグナルを発生して、転送されるバイトなしで成功します。 戻り値 成功すれば、uiomove(), uiomove_frombuf() と uiomove_nofault() は、0 を返 します。エラーのときに、それらは、適切なエラーコードを返します。 使用例 目的は、ドライバがそのデータのためのプライベートなバッファを保守し、この バッファの最大サイズのチャンクで要求を処理することです。下記のバッファの 取り扱いは、非常に単純化され、動作せず (バッファポインタが、部分的な読み 取りの場合に、進められません)、それは、uio の取り扱いを明示するためにだけ に、ここで示すことに注意してください。 /* MIN() は、次で見つけることができます: */ #include <sys/param.h> #define BUFSIZE 512 static char buffer[BUFSIZE]; static int data_available; /* 読み込みすることができるデータ量 */ static int fooread(struct cdev *dev, struct uio *uio, int flag) { int rv, amnt; rv = 0; while (uio->uio_resid > 0) { if (data_available > 0) { amnt = MIN(uio->uio_resid, data_available); rv = uiomove(buffer, amnt, uio); if (rv != 0) break; data_available -= amnt; } else tsleep(...); /* より良い時間を待つ */ } if (rv != 0) { /* ここで, エラーのクリーンアップを行なう */ } return (rv); } エラー uiomove() と uiomove_nofault() は、失敗して、次の場合に、次のエラーコード を返します: [EFAULT] 呼び出された copyin(9) または copyout(9) が EFAULT を 返した。 さらに、uiomove_nofault() は、次の場合に失敗して、次のエラーコードを返し ます: [EFAULT] ページフォルトが起こりました。 関連項目 read(2), readv(2), write(2), writev(2), copyin(9), copyout(9), sleep(9) 歴史 uio のメカニズムは、UNIX のある初期のバージョンで登場しました。 作者 このマニュアルページは、J"rg Wunsch によって書かれました。 FreeBSD 11.4 March 11, 2017 FreeBSD 11.4