【发布时间】:2016-08-26 05:06:45
【问题描述】:
以下是我的简单驱动代码的摘录。
int vprobe_ioctl( struct file *filep, unsigned int cmd, void *UserInp)
{
case IOCTL_GET_MAX_PORTS:
*(int*)UserInp = TotalPorts;
#if ENABLED_DEBUG
printk("Available port :%u \n ", TotalPorts);
#endif
break;
}
我不知道在用户空间内存上写入时应该使用的函数copy_to_user。代码直接访问用户地址。但是我的开发系统(x86_64 架构)中仍然没有出现任何内核崩溃。它按预期工作。
但有时我在其他一些 x86_64 机器中插入 .ko 文件时会看到内核崩溃。所以,我用copy_to_user 代替了直接访问,就可以了。
谁能解释一下,
i) 如何直接访问用户地址?
ii) 为什么我在某些系统中看到内核崩溃,而在某些其他系统中却运行良好。系统之间是否存在内核配置不匹配,导致内核可以直接访问用户进程的虚拟地址?
注意:我使用的所有系统都有相同的操作系统和内核。通过 kickstart 生成相同的图像。 - 没有任何差异的可能性。
提前致谢。
【问题讨论】:
-
几乎是a duplicate。还有
put_user()可能更适合您的单 int 情况。 -
@RomanKhimov 从您提到的问题中,我了解到
copy_to_user确实会检查该地址是否属于用户空间。我怀疑直接访问是如何工作的。另外,为什么直接访问在某些系统中有效,而在其他具有相同操作系统和内核的系统中无效。
标签: c linux-kernel