假设我将用户上下文数据存储在内核内存指针中。假设我还有一个指向用户空间char *的指针。然后我创建一个内核线程,内核线程可以有这两个指针。从线程我可以使用指针访问用户空间数据?我可以在系统调用中访问它们,但问题是我可以从内核线程访问它们吗?如何从Workqueue访问它们?
假设我的userprocess调用系统调用
//User Application
char* abc = "This is data.";
syscall(340, p);
在系统调用处理程序
中void sys_340(void* p) {
th = kthread_run("kth", kt_func, p);
//might also store process context as I am in system call!! How?
}
void kt_func(void *p) {
while(1){ printk("Line: %s\n",p); sleep(1000); }
}
我希望kt_func在每1个seceond中打印“This is data”。
答案 0 :(得分:0)
内核线程可以访问用户空间内存的任何部分(假设它们有适当的指针)。正如您的代码所示,作为系统调用的一部分,您希望启动一个新的内核线程并让它每1秒打印一次。我假设在创建内核线程后,您将从系统调用返回。这里的问题是:从系统调用返回后,用户进程也可以访问 p 指向的内存,内核线程也可以访问它。您如何确保指针 p 的同步访问? (也许通过另一个系统调用)。
虽然,我看不到你在做什么用例?
答案 1 :(得分:0)
在您的系统调用处理程序中,您可以执行类似
的操作struct mm_struct *mm = get_task_mm(current);
隐藏进行系统调用的进程的内存映射。然后在您的内核线程中,您可以执行类似
的操作access_remote_vm(mm, p, my_kernel_buf, length, 0);
在原始任务的内存中执行等效的copy_from_user()
。