加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

是否会直接访问用户空间地址而不是copy_to_user?

发布时间:2020-12-16 07:17:20 所属栏目:百科 来源:网络整理
导读:以下是我简单的驱动程序代码的摘录. 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;} 我
以下是我简单的驱动程序代码的摘录.

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生成相同的图像. – 没有任何差异.

提前致谢.

解决方法

看到崩溃会很有趣.现在,我所说的是基于我对记忆如何运作的了解的假设.
用户空间内存是虚拟的.这意味着特定进程地址X现在位于某个物理内存上,此物理内存是当前分配给进程的内存页面.复制到用户首先检查给定的内存是否真正属于进程和其他安全检查.旁边有映射问题.

内核内存有自己的地址空间,需要将虚拟映射到物理地址.内核使用mmu的帮助(这在每个架构中是不同的).在x86中,内核虚拟和用户虚拟之间的映射是1:1(这里有不同的问题).在其他系统中,这并非总是如此.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读