我正在开发一个涉及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));
}
答案 0 :(得分:7)
这不行,因为copy_from_user()
从当前用户进程复制(这应该很明显,因为无法告诉它要从哪个用户进程复制)。
在用户空间进程调用的系统调用中,这是正常的,因为当前进程是您的用户空间进程。但是,在内核线程中,当前进程可能是系统上的任何其他进程 - 因此您要从随机进程的内存中进行复制,这就是为什么会出现垃圾。
如果要在内核和用户空间进程之间共享内存,正确的方法是让内核分配它,然后允许用户空间进程将其映射到其地址空间与mmap()
。内核线程和用户空间进程将使用不同的指针来引用内存区域 - 内核线程将使用指向内核地址空间内分配的内存的指针,而用户空间进程将使用指向由{返回的内存区域的指针{1}}。
答案 1 :(得分:1)
不,通常不行,因为data
是内核虚拟地址,不是用户虚拟地址。
但是,IFF你调用kthread_create
data
参数等于__user
指针,这应该没问题。