我在内核模块中创建了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�
我该如何解决这个问题?
答案 0 :(得分:5)
可能copy_from_user()
没有放置空字节终止符,因为args
大于或等于n
而printk()
期望空终止一,所以你正在访问垃圾值。要解决此问题,请将自己buf
初始化为零:
char buff[14 + 1] = {0}; // +1 for make room to 0-byte-terminattor.
它将用{0}填充buf
的所有字节。
修改强>
正如评论中提到的@caf,你需要为null-byte-terminattor留出一些空间。因此,不是准确地给出要运行的缓冲区大小,而是将它传递给n-1,这样函数将循环unl n
然后放入空字节。