Get_user, работающий в режиме ядра, возвращает ошибку - PullRequest
1 голос
/ 28 апреля 2010

У меня проблема с макросом get_user (). Я сделал следующее:

Я запускаю следующую программу

int main() 
{ 
    int a = 20; 
    printf("address of a: %p", &a); 
    sleep(200); 
    return 0; 
} 

Когда программа запускается, она выводит адрес, скажем, 0xbff91914.

Затем я передаю этот адрес модулю, работающему в режиме ядра, который извлекает содержимое по этому адресу (в то время, когда я это делал, я также удостоверился, что процесс не завершился, потому что перевел его в режим ожидания на 200 секунд ...):

Адрес сначала отправляется в виде строки, и я приведу их к типу указателя.

int * ptr = (int*)simple_strtol(buffer, NULL,16); 
printk("address: %p",ptr); // I use this line to make sure the cast is correct. When running, it outputs bff91914, as expected. 
int val = 0; 
int res; 
res= get_user(val, (int*) ptr); 

Однако res всегда не равно 0, что означает, что get_user возвращает ошибку. Мне интересно, в чем проблема ....

Спасибо !!

- Фангкай

Ответы [ 2 ]

3 голосов
/ 28 апреля 2010

Вероятно, это потому, что вы пытаетесь получить значение из другого пользовательского пространства. Этот адрес получен из адресного пространства вашей простой программы, в то время как вы, вероятно, используете другую программу для передачи значения в модуль, не так ли?

2 голосов
/ 28 апреля 2010

Вызов get_user должен быть сделан в контексте пользовательского процесса.

Поскольку вы пишете: «Я также позаботился о том, чтобы процесс не завершился, потому что я усыпил его на 200 секунд ...» У меня такое чувство, что вы не соблюдаете это правило. Чтобы вызов get_user был в контексте пользовательского процесса, вы должны были бы сделать системный вызов из этого процесса, и не было бы необходимости останавливать процесс.

Итак, вам нужно, чтобы ваш пользовательский процесс совершил системный вызов (ioctl было бы хорошо), и из этого системного вызова осуществите вызов get_user.

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