2015-01-13 3 views
0

Я пытаюсь использовать эту функцию для копирования буфера от пользователя к одному в ядре. были выделены оба буфера. Я использую while в случае, если не все байты были скопированы с первой попытки. но по какой-то причине ничего не копируется, и программа застревает в цикле while. Каковы могут быть причины этого?Проблема с copy_from_user в ядре

void my_copy_from_user(const char* source_buff, char* dest_buff, int size_to_copy){ 
    int not_copied = size_to_copy 
    int left = size_to_copy; 

    while(not_copied){ 
     not_copied = copy_from_user(dest_buff, source_buff, left); 
     dest_buff += (left - not_copied); 
     source_buff += (left - not_copied); 
     left = not_copied; 
    } 
} 

ответ

0

Возможно, что это законно не удается по причинам, из-за которых вы не можете оправиться.

Пожалуйста, смотрите: http://lxr.free-electrons.com/source/arch/x86/lib/usercopy_32.c#L681

unsigned long _copy_from_user(void *to, const void __user *from, unsigned n) 
{ 
    if (access_ok(VERIFY_READ, from, n)) 
     n = __copy_from_user(to, from, n); 
    else 
     memset(to, 0, n); 
    return n; 
} 

Это основная реализация для copy_from_user для Linux на процессорах x86. Сначала он проверяет access_ok. Если доступ не разрешен, он не сработает и немедленно вернется с n (количество байтов, которое вы запросили для копирования). Это вызовет бесконечный цикл.

Две точки:

  • Я не думаю, что вы должны вызывать copy_from_user в цикле, как это. Если он не копируется в режиме ядра, возникает причина причины. Это отличный зверь от read() функций при чтении из сокетов и т. Д., Где вам предлагается читать() в цикле.
  • Вы уверены что вы передаете правильно dest_buff до copy_from_user?

Советы:

  • Printk все ценности и посмотреть, что происходит. Изменен ли left? Скорее всего, нет.
+0

Информация в ссылке выглядит полезной, но, пожалуйста, вставьте соответствующий код здесь, если ссылка будет нарушена в будущем, и поэтому ваш ответ будет более полным. – djv