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));
這工作完全
我因爲以下不工作我更糊塗了。我很困惑,並會喜歡你們可以提供的任何幫助。
謝謝!我確實認爲我需要分配一個緩衝區,這就是爲什麼消息結構包含消息的大小。我仍然不確定爲什麼當複製結構(它只是一個int和一個指針)時,它也複製了文本緩衝區。 另外,我很困惑,爲什麼在第一個copy_from_user中,文本仍然是空的。不,它不會複製緩衝區,但不應複製內容(如用戶空間指針)?我知道指針不起作用,但我不確定爲什麼文本保持爲空。 – kodai
@ kodai:你的'Message'例子根本不復制文本緩衝區 - 它只是複製文本緩衝區的(用戶空間)地址。這是錯誤的,因爲用戶空間指針不應該被內核直接解除引用 - 它不適用於所有的體系結構,甚至在它工作的地方也不安全。 – caf
另外,不要忘記你需要複製整個字符串。 ''copy_from_user(text,(char *)arg,sizeof(char *));''只複製指針的大小。應該像''copy_from_user(text,(char *)arg,strlen(arg));'',但我不記得內核代碼是否實現''strlen''。 – Fred