2013-04-08 3 views
0

Я собираюсь написать модуль ядра Linux для малины Pi. Все хорошо, за исключением того, что когда я пытаюсь использовать либо copy_to_user, либо put_user, он всегда возвращает значение «34336», если я печатаю его как llu, и если я печатаю его как символ, это ничего.Модуль ядра Linux copy_to_user не работает

Интересно, что он работал, я внес некоторые изменения, он прекратил работать, я вернулся к рабочей версии, и он больше не работает.

код из модуля:

ssize_t st_read(struct file *filp, char *buf, size_t count, loff_t *f_pos) 
    { 
      char memory_buffer = 'b'; 
      /* Transferring data to user space */ 
      copy_to_user(buf,memory_buffer,1); 

      /* Changing reading position as best suits */ 
      if (*f_pos == 0) { 
        *f_pos+=1; 
        return 1; 
      } else { 
        return 0; 
      } 
    } 

Код чтения значение:

fd = open("/dev/systimer", O_RDONLY); 

    // check for errors 
    if(fd < 0) { 
      perror("open(O_RDONLY)"); 
      return errno; 
    } else 
      close(fd); 

    read(fd, &buf, 1); 
    printf("Buffer: %llu\n", buf); 
    printf("Buffer2: %c\n", buf); 

Выход:

Buffer: 34336 
    Buffer2: 

Спасибо.

+0

Является ли 'buf' объявленным как' char' или 'unsigned long long'? –

+0

Какой тип 'buf'? Это идентично 'memory_buffer'? Что является результатом 'printf (« Буфер:% x \ n », buf);'? – Wayne

ответ

-1

Вы пробовали?

copy_to_user(buf, &memory_buffer, 1); 
+0

Да, я пробовал это, у меня был тот же результат. – MustardTiger

+0

@MustardTiger Было ли такое же значение ('34336')? –

-2

Вы можете попробовать следующий код вместо copy_to_user

sprintf(buf, "%u\n", memory_buffer); 

-Phani

0

Вы закрыли перед чтением. Вы всегда должны проверить возвращаемое значение read()

// check for errors 
if(fd < 0) { 
     perror("open(O_RDONLY)"); 
     return errno; 
} else 
     close(fd); // <-- you are closing the fd here 

read(fd, &buf, 1); // <-- fd is closed 
Смежные вопросы