以下是我的简单驱动程序代码的摘录。
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生成相同的图像。 - 没有任何差异。
提前致谢。
答案 0 :(得分:1)
内核内存有自己的地址空间,需要将虚拟映射到物理地址。内核使用mmu的帮助(这在每个架构中是不同的)。在x86中,内核虚拟和用户虚拟之间的映射是1:1(这里有不同的问题)。在其他系统中,这并非总是如此。