运维开发网

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

运维开发网 https://www.qedev.com 2020-05-11 16:46 出处:网络
我正在开发一个涉及kthreads的内核应用程序.我创建了一个结构数组,并在用户空间中使用malloc分配内存.然后我调用系统调用(我实现了)并将数组的地址传递给内核空间.在系统调用的处理程序中我创建了我创建2个kthreads来
我正在开发一个涉及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返回的内存区域的指针().

0

精彩评论

暂无评论...
验证码 换一张
取 消