【问题标题】:Call do_fork inside kernel在内核中调用 do_fork
【发布时间】:2015-07-13 21:35:50
【问题描述】:

出于某些实验目的,我需要创建一个没有共享内存的子内核进程。据我所知,kthread_create 和 kernel_thread 例程总是用 CLONE_VM 调用 do_fork。但我需要在没有 CLONE_VM 的情况下调用 do_fork

我在arch/x86_64/kernel/process.c中找到了(x86_64是适合实验的架构):

asmlinkage long sys_fork(struct pt_regs *regs)
{
        return do_fork(SIGCHLD, regs->rsp, regs, 0, NULL, NULL);
}

我认为,我应该调用 do_fork(SIGCHLD, regs->rsp, regs, 0, NULL, NULL)。但我不明白如何设置 pt_regs 结构。我想根据当前进程的寄存器设置结构。 是否有根据当前进程填充 pt_regs 的功能?或者也许有一种不同的方法可以在内核中使用自己的内存创建进程?

【问题讨论】:

    标签: c linux linux-kernel kernel fork


    【解决方案1】:

    内核的地址空间总是在进程之间共享。 CLONE_VM 标志只影响用户地址空间共享。

    所以,如果您需要内核进程,只需使用kthread_create。使用此函数创建的线程只能使用内核地址空间。

    【讨论】:

      【解决方案2】:

      你不需要填写pt_regs结构;唯一使用的是用户空间任务的堆栈指针。 sys_foo 形式的例程名称总是期望用户空间值;例如,任何传入的地址值都必须是用户空间地址。另一方面,像 do_foo 这样形成的工作例程需要内核空间值;永远不要从内核内部调用 sys_foo

      【讨论】:

        猜你喜欢
        • 2012-01-17
        • 2021-02-07
        • 1970-01-01
        • 1970-01-01
        • 2013-10-28
        • 1970-01-01
        • 2012-11-06
        • 2019-06-10
        • 1970-01-01
        相关资源
        最近更新 更多