2008-09-15 11 views
3

カーネルスペースからユーザースペースにカスタム構造体をコピーしようとしています。内部ユーザ空間errnoは 'bad address'を返します。不良アドレスエラーの通常の原因は何ですか?copy_to_userから 'bad address'エラーが発生しました

if(copy_to_user(info, &kernel_info, sizeof(struct prinfo))) 

答えて

5

あなたが指定したアドレスの場所が無効であることを意味します。上記の場合は、infoのメモリ位置へのポインタの代わりにinfoのコピーを渡しているためです。情報がポインタ型であると仮定すると

if(copy_to_user(&info, &kernel_info, sizeof(struct prinfo))) { 
    //some stuff here i guess 
} 
2

:あなたのinfo変数は、私はあなたのコードがあることを更新してしまうポインタでない限り、ドキュメントを見てみると、copy_to_user

ので
copy_to_user(void __user * to, const void * from, unsigned long n); 

として定義されて

その情報が有効な場所を指している場合、その情報がその機能に必要なユーザー空間にないアドレスを指している可能性があります。

-1

小さな文字ドライバを書くときに同じ問題が発生しました。私が間違っていたのは、関数copy_to_userが失敗したときにゼロ以外の値を返すということでした。これを行う必要があります。

if(copy_to_user(void *userbuf, void *kernelbuf, long len)) 
    return -EFAULT; 

// Continue with code.. 
+0

これはOPが尋ねたことではありません – Adam

関連する問題