COPY(9)

名称
copy, copyin, copyout, copystr, copyinstr, copyoutstr - カーネル空間からユーザ空間/ユーザ空間からカーネル空間へのコピー関数

書式
#include <sys/types.h> #include <sys/systm.h> int copyin(const void *uaddr, void *kaddr, size_t len) int copyout(const void *kaddr, void *uaddr, size_t len) int copystr(const void *kfaddr, void *kdaddr, size_t len, size_t *done) int copyinstr(const void *uaddr, void *kaddr, size_t len, size_t *done) int copyoutstr(const void *kaddr, void *uaddr, size_t len, size_t *done)

解説
copy 関数群は、連続したデータをあるアドレスから他のアドレスへコピーするよう 設計されています。 copystr() 以外はすべて、ユーザ空間からカーネル空間またはカーネル空間からユーザ空間へ コピーを行います。

copy ルーチンは以下のような機能を提供します:

copyin()
    len バイトのデータを、ユーザ空間アドレス uaddr から カーネル空間アドレス kaddr へコピーします。

copyout()
    len バイトのデータを、カーネル空間アドレス kaddr からユーザ空間アドレス uaddr へコピーします。

copystr()
    カーネル空間アドレス kfaddr からカーネル空間アドレス kdaddr へ、最大で len バイトの長さぶんだけ NUL 文字で終わる文字列をコピーします。 もし done 引数が NULL でなければ、 実際にコピーしたバイト数を NUL 文字を含めて *done に格納します。

copyinstr()
    ユーザ空間アドレス uaddr からカーネル空間アドレス kfaddr へ、最大で len バイトの長さぶんだけ NUL 文字で終わる文字列をコピーします。 もし done 引数が NULL でなければ、 実際にコピーしたバイト数を NUL 文字を含めて *done に格納します。

copyoutstr()
    カーネル空間アドレス kaddr からユーザ空間アドレス uaddr へ、最大で len バイトの長さぶんだけ NUL 文字で終わる文字列をコピーします。 もし done 引数が NULL でなければ、 実際にコピーしたバイト数を NUL 文字を含めて *done に格納します。

戻り値
関数 copy は、成功時には 0 を返し、不正なアドレスな場合は EFAULT を返します。 さらに、 copystr(), copyinstr(), copyoutstr() は、文字列が len バイトより長かった場合に ENAMETOOLONG を返します。

関連項目
fetch(9), store(9)