我对内核编程有点新意,所以请原谅这个问题。本质上,我想将一个字符串(char *)发送到内核模块以进行打印。很简单。
我在用户级代码中有以下内容:
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));
这完美无缺。我真的很困惑,很乐意为你们提供任何帮助。
答案 0 :(得分:3)
我并不是说听起来很苛刻,但我认为在编写内核模块之前你需要学习一点C: - )
copy_from_user完全符合名称的含义 - 它将缓冲区形式的用户空间提供缓冲区复制到内核提供的缓冲区。这意味着你需要为它提供一个内核分配缓冲区,它不会为你分配一个!
您的char *文本分配指向缓冲区的指针,但不是缓冲区。您需要自己进行缓冲区分配。
请注意,在第二个示例中,Message结构被定义为全局或堆栈(无法从您的示例中得知),因此分配发生并且有效。