2011-09-26 93 views
0

我對內核編程有點新,所以請原諒這個問題。本質上,我想發送一個字符串(char *)到內核模塊打印出來。很簡單。copy_from_user不適用於字符*

我有一個用戶級代碼如下:

char *text = "some text.";  
ioctl(fd,OUTPUT_TEST,text); 

還有的在模塊內部:

char *text; 
case OUTPUT_TEST: 
    copy_from_user(text,(char *)arg,sizeof(char*); 

然而,文本保持爲空。這不應該是一個指向字符串的指針嗎?

在用戶級別:

typedef struct 
{ 
    int size; 
    char *text; 
}Message; 

    int fd = open ("/proc/ioctl_test", O_RDONLY); 
    Message message; 
    message.text = "This message was sent via OCTL."; 
    message.size = strlen(message.text); 

    ioctl(fd,OUTPUT_TEST,message); 

而在內核空間:

copy_from_user(&message,(Message *)arg,sizeof(Message)); 

這工作完全

我因爲以下不工作我更糊塗了。我很困惑,並會喜歡你們可以提供的任何幫助。

回答

3

我的意思不是聽起來刺耳,但我認爲你需要編寫內核模塊:-)

調用copy_from_user前位學習C不正是顧名思義 - 它會將緩衝區形式的用戶空間提供緩衝到內核​​提供的緩衝區。這意味着你需要爲它提供一個內核分配的緩衝區,它不會爲你分配一個緩衝區!

你的char *文本分配一個指向緩衝區的指針,但不是緩衝區。你需要自己做緩衝區分配。

請注意,在第二個示例中,Message結構被定義爲全局或堆棧(不能從您的示例中看出),因此分配發生並且它可以工作。

+0

謝謝!我確實認爲我需要分配一個緩衝區,這就是爲什麼消息結構包含消息的大小。我仍然不確定爲什麼當複製結構(它只是一個int和一個指針)時,它也複製了文本緩衝區。 另外,我很困惑,爲什麼在第一個copy_from_user中,文本仍然是空的。不,它不會複製緩衝區,但不應複製內容(如用戶空間指針)?我知道指針不起作用,但我不確定爲什麼文本保持爲空。 – kodai

+1

@ kodai:你的'Message'例子根本不復制文本緩衝區 - 它只是複製文本緩衝區的(用戶空間)地址。這是錯誤的,因爲用戶空間指針不應該被內核直接解除引用 - 它不適用於所有的體系結構,甚至在它工作的地方也不安全。 – caf

+0

另外,不要忘記你需要複製整個字符串。 ''copy_from_user(text,(char *)arg,sizeof(char *));''只複製指針的大小。應該像''copy_from_user(text,(char *)arg,strlen(arg));'',但我不記得內核代碼是否實現''strlen''。 – Fred

相關問題