カスタム構造体をカーネル空間からユーザー空間にコピーしようとしています。ユーザー空間内で errno が「不正なアドレス」を返します。不正なアドレス エラーの通常の原因は何ですか?
if(copy_to_user(info, &kernel_info, sizeof(struct prinfo)))
Bad Address エラーは、指定した住所が無効であることを意味します。上記のケースでは、のメモリ位置info
へのポインタではなく のコピーを渡しているためだと思います。info
ドキュメントを見ると、次のcopy_to_user
ように定義されています
copy_to_user(void __user * to, const void * from, unsigned long n);
したがって、info
変数がポインターでない限り、コードを次のように更新します。
if(copy_to_user(&info, &kernel_info, sizeof(struct prinfo)) ) {
//some stuff here i guess
}
info がポインター型であり、その info が有効な場所を指していると仮定すると、関数が必要とするユーザー空間にないアドレスを info が指している可能性があります。