gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:04:51 28 4
gpt4 key购买 nike

我正在开发一个涉及 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() 返回的内存区域的指针.

关于linux-kernel - 用户空间和内核线程之间的共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7911425/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com