2

我在内核模块中创建了 WRITE_IOCTL 并在用户模式下调用它:

ioctl(fd, WRITE_IOCTL, "Hello, Kernel!");

在内核模式下,我有:

static int device_ioctl(struct file *filp,
    unsigned int cmd, unsigned long args) {
  char buff[14];

  switch (cmd) {
  case WRITE_IOCTL:
    copy_from_user( buff,(char *)args, 14);
    printk("This message received from User Space: %s\n", buff);
    break;
  }
  return 0;
}

当我运行这个 ioctl 时,我在 /var/log/kern.log 中有一些类似论文的东西:

This message received from User Space: Hello, Kernel!vE�
This message received from User Space: Hello, Kernel!M�
This message received from User Space: Hello, Kernel!M�

我怎么解决这个问题??

4

1 回答 1

5

可能copy_from_user()没有放置空字节终止符,因为args它大于或等于您的n并且printk()期望一个空终止符,因此您正在访问垃圾值。为了解决这个问题,将自己初始化buf为零:

  char buff[14 + 1] = {0}; // +1 for make room to 0-byte-terminattor.

它将buf用零填充所有字节。

编辑:

正如评论中提到的@caf,您需要为空字节终止符留出一些空间。因此,与其给出函数的确切缓冲区大小,不如将其传递 n-1,以便函数循环 untl n,然后放入空字节。

于 2013-11-02T18:04:26.910 回答