カーネルスペースからユーザースペースにカスタム構造体をコピーしようとしています。内部ユーザ空間errnoは 'bad address'を返します。不良アドレスエラーの通常の原因は何ですか?copy_to_userから 'bad address'エラーが発生しました
if(copy_to_user(info, &kernel_info, sizeof(struct prinfo)))
カーネルスペースからユーザースペースにカスタム構造体をコピーしようとしています。内部ユーザ空間errnoは 'bad address'を返します。不良アドレスエラーの通常の原因は何ですか?copy_to_userから 'bad address'エラーが発生しました
if(copy_to_user(info, &kernel_info, sizeof(struct prinfo)))
あなたが指定したアドレスの場所が無効であることを意味します。上記の場合は、info
のメモリ位置へのポインタの代わりにinfo
のコピーを渡しているためです。情報がポインタ型であると仮定すると
if(copy_to_user(&info, &kernel_info, sizeof(struct prinfo))) {
//some stuff here i guess
}
:あなたのinfo
変数は、私はあなたのコードがあることを更新してしまうポインタでない限り、ドキュメントを見てみると、copy_to_user
が
copy_to_user(void __user * to, const void * from, unsigned long n);
として定義されて
その情報が有効な場所を指している場合、その情報がその機能に必要なユーザー空間にないアドレスを指している可能性があります。
小さな文字ドライバを書くときに同じ問題が発生しました。私が間違っていたのは、関数copy_to_userが失敗したときにゼロ以外の値を返すということでした。これを行う必要があります。
if(copy_to_user(void *userbuf, void *kernelbuf, long len))
return -EFAULT;
// Continue with code..
これはOPが尋ねたことではありません – Adam