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



假设我将用户上下文数据存储在内核内存指针中。假设我还有一个指向用户空间char *的指针。然后我创建一个内核线程内核线程可以有这两个指针。从线程我可以访问用户空间数据使用指针?我可以在系统调用中访问它们,但问题是我可以从内核线程访问它们吗?如何从工作队列访问它们?

假设我的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: %sn",p); sleep(1000); } 
}

我想让kt_func每1秒打印"This is data"

内核线程可以访问用户空间内存的任何部分(只要它们有正确的指针指向它)。正如您的代码所示,作为系统调用的一部分,您希望启动一个新的内核线程,并让它每1秒打印一些东西。我假设在创建内核线程之后,您将从系统调用中返回。这里的问题是:一旦从系统调用返回,用户进程也可以访问由p指向的内存,内核线程也可以访问它。如何保证指针p的同步访问?(可能通过另一个系统调用)。

虽然,我看不出你在做什么用例

在系统调用处理程序中,您可以执行如下操作

struct mm_struct *mm = get_task_mm(current);

隐藏发出系统调用的进程的内存映射。然后在内核线程中,你可以这样做

access_remote_vm(mm, p, my_kernel_buf, length, 0);

在原任务的内存上执行相当于copy_from_user()的操作

最新更新