COPY(9) | FreeBSD Kernel Developer's Manual | COPY(9) |
名称
copy, copyin, copyin_nofault, copyout, copyout_nofault, copystr, copyinstr — カーネルコピー関数書式
#include < sys/types.h>#include < sys/systm.h>
int
copyin( const void *uaddr, void *kaddr, size_t len);
int
copyin_nofault( const void *uaddr, void *kaddr, size_t len);
int
copyout( const void *kaddr, void *uaddr, size_t len);
int
copyout_nofault( 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);
解説
copy 関数は、1 つのアドレスから別のアドレスまで連続したデータをコピーするように設計されています。 copystr() のほかはすべて、ユーザ空間からカーネル空間まで、または逆もまた同様にデータをコピーします。copyin() と copyin_nofault() 関数は、ユーザ空間アドレス uaddr からカーネル空間アドレス kaddr まで len バイトのデータをコピーします。
copyout() と copyout_nofault() 関数は、カーネル空間アドレス kaddr からユーザ空間アドレス uaddr まで len バイトのデータをコピーします。
copyin_nofault() と copyout_nofault() 関数は、カーネル空間とユーザ空間のデータがページフォルトを起こさずにアクセス可能であることを必要とします。発信元と宛先アドレスは、それぞれ読み込みと書き込みアクセスのために物理的にマップされなければなりません、そして発信元も宛先アドレスもページ可能でないかもしれません。
copystr() 関数は、多くても len バイト長のカーネル空間アドレス kfaddr からカーネル空間アドレス kdaddr までヌル文字で終了した文字列をコピーします。終端のヌル文字を含んで、実際にコピーされたバイト数は、 ( done が NULL でないなら) *done に返されます。
copyinstr() 関数は、ユーザ空間アドレス uaddr からカーネル空間アドレス kaddr まで、多くても len バイトの長のヌル文字で終了する文字列をコピーします。終端のヌル文字を含んで、実際にコピーされたバイト数は、 ( done が NULL でないなら) *done に返されます。
戻り値
copy 関数は、成功すれば、0 を、不正なアドレスに遭遇するなら、 EFAULT を返します。さらに、 copyin_nofault() と copyout_nofault() 関数は、ページフォルトが起こるなら、 EFAULT を返し、 copystr() と copyinstr() 関数は、文字列が len バイトより長いなら、 ENAMETOOLONG を返します。July 9, 2011 | FreeBSD |