Linux用户进程上下文访问用户虚拟内存

时间:2011-10-31 03:39:40

标签: memory-management linux-kernel kernel

假设我将用户上下文数据存储在内核内存指针中。假设我还有一个指向用户空间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”。

2 个答案:

答案 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()