2013-04-08 53 views
0

我正在嘗試爲Raspberry Pi編寫Linux內核模塊。一切都很好,除了當我嘗試使用copy_to_user或put_user時,如果我將它打印爲llu,它總是返回一個「34336」的值,並且如果將它打印爲字符,則不會有任何結果。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'? – 2013-05-02 16:00:21

+0

'buf'的類型是什麼?與memory_buffer相同嗎? 'printf(「Buffer:%x \ n」,buf)的結果是什麼;'? – Wayne 2013-09-09 03:43:38

回答

-1

你試過了嗎?

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

是的,我已經嘗試過,我有同樣的結果。 – MustardTiger 2013-04-09 01:33:49

+0

@MustardTiger它的價值是否相同('34336')? – 2013-05-02 15:58:12

-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