2008-09-15 3 views
3

커널 공간에서 사용자 공간으로 사용자 정의 구조체를 복사하려고합니다. 내부 사용자 공간 errno는 'bad address'를 반환합니다. 잘못된 주소 오류의 일반적인 원인은 무엇입니까?copy_to_user에서 'bad address'오류가 발생했습니다.

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

답변

5

잘못된 주소 오류는 사용자가 지정한 주소 위치가 유효하지 않음을 나타냅니다. 위의 경우에는 info의 메모리 위치에 대한 포인터 대신에 info 사본을 전달하기 때문에 이것이 맞을 것이라고 추측 할 수 있습니다. 워드 프로세서 보면

copy_to_user은 당신의 info 변수 내가 업데이트 할 포인터가 아닌 그래서 코드가 될

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

으로 정의된다 : 그 정보를 가정

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

포인터 타입이다 그 정보가 유효한 위치를 가리키고 있어도 정보가 기능에 필요한 사용자 공간에없는 주소를 가리킬 가능성이 여전히 있습니다.

-1

작은 char 드라이버를 쓰는 동안 동일한 문제가있었습니다. 내가 잘못하고있는 것은 copy_to_user 함수가 실패 할 때 0이 아닌 값을 반환한다는 것입니다. 따라서이 작업을 수행해야합니다.

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

// Continue with code.. 
+0

OP가 질문 한 내용이 아닙니다. – Adam

관련 문제