【问题标题】:Shared Memory between User Space and Kernel Threads用户空间和内核线程之间的共享内存
【发布时间】:2011-12-16 05:17:55
【问题描述】:

我正在开发一个涉及 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));
}

【问题讨论】:

    标签: linux-kernel kernel


    【解决方案1】:

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

    在您的用户空间进程调用的系统调用中,这是可以的,因为当前进程是您的用户空间进程。但是,在内核线程中,当前进程可能是系统上的任何其他进程 - 因此您正在从随机进程的内存中复制,这就是您得到垃圾的原因。

    如果你想在内核和用户空间进程之间共享内存,正确的做法是让内核分配它,然后让用户空间进程将它映射到它的地址空间与mmap()。内核线程和用户空间进程将使用不同的指针来引用内存区域——内核线程将使用指向内核地址空间内分配的内存的指针,而用户空间进程将使用@返回的内存区域的指针987654323@.

    【讨论】:

    • 你完全正确。我正在考虑从系统调用中保存上下文并将此上下文用于 copy_from_user 但我想这可能不合适。我也在考虑mmap。你能给我一个在 Linux 内核 2.6 中工作的例子吗?
    • @max 请你找到一个例子吗?我陷入了同样的问题,没有找到任何如何从内核空间分配内存并使用 mmap 从用户空间映射它的方法
    【解决方案2】:

    不,通常这是不行的,因为data 是内核虚拟地址,不是用户虚拟地址。

    但是,如果您使用等于 __user 指针的 data 参数调用 kthread_create,这应该没问题。

    【讨论】:

    • 我试过了,但是不行。从内核空间 kthread 访问用户空间指针时遇到了麻烦。我可以在系统调用函数中访问内存,但在 kthread 函数中我无法访问它。我的简单查询是如何在 kthreads 和用户空间之间获取共享内存。
    • 您不能只将用户指针塞入内核线程。它意味着 nothing 在另一个任务的上下文中,而不是用户进程。
    猜你喜欢
    • 2012-03-02
    • 2018-06-08
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2016-08-14
    • 2011-12-18
    • 2016-03-01
    • 2015-12-12
    相关资源
    最近更新 更多