ошибка "неверный адрес" от copy_to_user - PullRequest
3 голосов
/ 15 сентября 2008

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

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

Ответы [ 3 ]

5 голосов
/ 15 сентября 2008

Ошибка неверного адреса означает, что указанное вами адресное местоположение неверно. В случае, описанном выше, я бы предположил, что это потому, что вы передаете копию 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 голосов
/ 16 сентября 2008

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

0 голосов
/ 21 апреля 2015

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

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

// Continue with code..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...