2012-09-10 21 views
0

我想添加一個proc文件從內核讀取一些信息。但是當我嘗試從proc文件中獲取信息時,它會給出「錯誤的地址」錯誤。當使用copy_to_user,它給出了錯誤的地址

int proc_read(char *buffer, char **starter, off_t off, int count, 
       int *eof, void *data) 
{ 

    if (off > 0) 
    { 
     *eof = 1; 
     return 0; 
    } 

    if (copy_to_user(buffer, info_str, info_str_size)) 
    { 
     return -EFAULT; 
    } 

    return info_str_size; 
} 

insmod後,使用cat讀取proc文件,但給人的壞地址錯誤; info_str是全球性的char陣列。

+3

似乎沒問題,你可以顯示info_str和info_str_size的定義 – roni

回答

3

您的問題的答案是驚人的簡單。在proc_read函數中,你不需要使用copy_to_user:簡單的memcpy將完成這項工作,因爲緩衝區駐留在內核內存中。但是,如果要創建proc_write函數,則需要使用copy_from_user,因爲在這種情況下,緩衝區駐留在用戶內存中。

一個提示是,你應該也可能成功告知EOF。這將使您的功能免於需要被調用兩次。

以下就足夠了:

int proc_read(char *buffer, char **starter, off_t off, int count, 
       int *eof, void *data) 
{ 
    if (off > 0) 
    { 
     *eof = 1; 
     return 0; 
    } 

    memcpy(buffer, info_str, info_str_size); 
    *eof = 1; 
    return info_str_size; 
} 

你也應該注意到,寫入文件項的這種方式是很老,你或許應該避免。 seq_file接口更不易出錯(並且與尋呼機一起工作的越來越少)。如果你有興趣,請看http://lwn.net/Articles/22355/

相關問題