2008-09-15 7 views
3

Я пытаюсь скопировать настраиваемую структуру из пространства ядра в пространство пользователя. внутри пользовательского пространства errno возвращает «плохой адрес». Какова обычная причина плохой ошибки адреса?Ошибка «bad address» от copy_to_user

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

ответ

5

Плохая ошибка адреса означает, что указанное вами адресное имя недействительно. В случае, которое вы делали выше, я предполагаю, что это потому, что вы передаете копию 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 
} 
2

Предполагая, что информация является тип указателя и эта информация указывает на допустимое местоположение, все же возможно, что информация указывает на адрес, который не находится в пользовательском пространстве, который требуется этой функции.

-1

У меня была такая же проблема при написании маленького драйвера. Все, что я делал неправильно, это функция copy_to_user возвращает ненулевое значение при сбое, поэтому вам нужно это сделать.

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

// Continue with code.. 
+0

Это не то, о чем спрашивал ОП – Adam 2016-04-04 00:39:33