我在内核模块中创建了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�
我怎么解决这个问题??
可能copy_from_user()
不放置null-byte-terminator,因为args
它大于或等于您的期望值,n
并且printk()
期望使用null-terminatted,因此您正在访问垃圾值。为了解决这个问题,请将自己初始化buf
为零:
char buff[14 + 1] = {0}; // +1 for make room to 0-byte-terminattor.
它将buf
用零填充所有的字节。
编辑:
正如@caf在评论中提到的那样,您需要为null-byte-terminattor留一些空间。因此,与其确切地给函数分配缓冲区大小,不如将其传递给n-1,这样函数将循环untl n
,然后放入空字节。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句