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

linux-kernel – 用户空间和内核线程之间的共享内存

发布时间:2020-12-14 01:14:04 所属栏目:Linux 来源:网络整理
导读:我正在开发一个涉及kthreads的内核应用程序.我创建了一个结构数组,并在用户空间中使用malloc分配内存.然后我调用系统调用(我实现了)并将数组的地址传递给内核空间.在系统调用的处理程序中我创建了我创建2个kthreads来监视数组. kthread可以更改某些值,用户空
我正在开发一个涉及kthreads的内核应用程序.我创建了一个结构数组,并在用户空间中使用malloc分配内存.然后我调用系统调用(我实现了)并将数组的地址传递给内核空间.在系统调用的处理程序中我创建了我创建2个kthreads来监视数组. kthread可以更改某些值,用户空间线程也可以更改某些值.我们的想法是将数组用作共享内存.但有些当我在内核空间中访问内存时(使用copy_from_user),数据会以某种方式被更改.我可以在分配时和内核中验证地址是否相同.但是当使用copy_from_user时,它会提供垃圾值等各种值.

还有以下说法好吗?

int kthread_run_function(void* data){
    struct entry tmp;
    copy_from_user(&tmp,data,sizeof(struct entry));
}

解决方法

这不行,因为copy_from_user()从当前用户进程复制(这应该是显而易见的,因为没有办法告诉它要从哪个用户进程复制).

在用户空间进程调用的系统调用中,这是可以的,因为当前进程是您的用户空间进程.但是,在内核线程中,当前进程可能是系统上的任何其他进程 – 因此您要从随机进程的内存进行复制,这就是为什么会出现垃圾.

如果要在内核和用户空间进程之间共享内存,执行此操作的正确方法是让内核分配它,然后允许用户空间进程使用mmap()将其映射到其地址空间.内核线程和用户空间进程将使用不同的指针来引用内存区域 – 内核线程将使用指向内核地址空间内分配的内存的指针,而用户空间进程将使用指向mmap返回的内存区域的指针().

(编辑:李大同)

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

    推荐文章
      热点阅读