copy_from_user不适用于char *

时间:2011-09-26 00:23:01

标签: linux-kernel kernel-module

我对内核编程有点新意,所以请原谅这个问题。本质上,我想将一个字符串(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));

这完美无缺。我真的很困惑,很乐意为你们提供任何帮助。

1 个答案:

答案 0 :(得分:3)

我并不是说听起来很苛刻,但我认为在编写内核模块之前你需要学习一点C: - )

copy_from_user完全符合名称的含义 - 它将缓冲区形式的用户空间提供缓冲区复制到内核提供的缓冲区。这意味着你需要为它提供一个内核分配缓冲区,它不会为你分配一个!

您的char *文本分配指向缓冲区的指针,但不是缓冲区。您需要自己进行缓冲区分配。

请注意,在第二个示例中,Message结构被定义为全局或堆栈(无法从您的示例中得知),因此分配发生并且有效。