为了一些实验目的,我需要创建一个没有共享内存的子内核进程。我知道,kthread_create和kernel_线程例程总是使用CLONE_VM调用do_fork。但我需要在没有克隆虚拟机的情况下调用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的函数?或者可能有一种不同的方法来创建内核中有自己内存的进程?

最佳答案

内核的地址空间总是在进程之间共享的。CLONE_VM标志仅影响用户地址空间共享。
因此,如果需要内核进程,只需使用kthread_create。使用此函数创建的线程只允许使用内核地址空间。

09-13 00:18