Kernel 在禁用写时复制的情况下调用do_fork

Kernel 在禁用写时复制的情况下调用do_fork,kernel,system-calls,copy-on-write,Kernel,System Calls,Copy On Write,我正在做一个操作系统分配,这是添加一个新的系统调用。称为“dumbfork”的系统调用需要fork一个进程,而不使用写时复制策略。因此,基本上它必须将整个地址空间复制到子进程 我能够设置并重新编译系统内核。我可以调用我的自定义系统调用,但我不知道如何实际实现dumbfork来禁用COW特性。其中一个源代码向我展示了如何调用do_fork。Dumbfork应该类似于sys_vWork。我不知道如何设置do_fork的参数。我试图模仿sys_fork是如何实现的,它给了我一个空指针解引用错误。有人能

我正在做一个操作系统分配,这是添加一个新的系统调用。称为“dumbfork”的系统调用需要fork一个进程,而不使用写时复制策略。因此,基本上它必须将整个地址空间复制到子进程

我能够设置并重新编译系统内核。我可以调用我的自定义系统调用,但我不知道如何实际实现dumbfork来禁用COW特性。其中一个源代码向我展示了如何调用do_fork。Dumbfork应该类似于sys_vWork。我不知道如何设置do_fork的参数。我试图模仿sys_fork是如何实现的,它给了我一个空指针解引用错误。有人能在这个问题上给我指点一下吗

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

do_fork
是一个非常通用的函数,用于
fork
vfork
clone
调用。与您想要实现的最相似的是
fork
clone
主要用于线程,
vfork
根本不复制地址空间)

在您的情况下,最好的解决方案似乎是让
do\u fork
接受新标志,例如
CLONE\u COPY\u EVERYTHING\u RIGHT\u
。然后,您应该找到负责写入时复制的代码,这取决于此标志是否已传递给
do_fork
:复制整个地址空间,或者(如果未传递此标志,则表明从原始系统调用之一调用了
do_fork
)使用现有的写入时复制策略。您的
dumbfork
系统调用看起来与
fork
调用几乎相同,除了附加标志

asmlinkage int sys_dumbfork(struct pt_regs *regs)
{
     return do_fork(CLONE_COPY_EVERYTHING_RIGHT_NOW | SIGCHLD, regs->sp, regs, 0, NULL, NULL);
}

页面虽然已经过时,但可能非常有用,尤其是Fork ICA写下即复制部分。在
fork
syscall
copy\u page\u range
期间调用了一个函数,该函数将页面标记为只读。这似乎是您应该考虑添加内存复制代码的地方。此外,在页面错误期间调用函数
do\u wp\u page
,以便复制以前共享的页面,这可能是一个很好的例子。这是一个非常通用的函数,用于
fork
vfork
clone
调用。与您想要实现的最相似的是
fork
clone
主要用于线程,
vfork
根本不复制地址空间)

在您的情况下,最好的解决方案似乎是让
do\u fork
接受新标志,例如
CLONE\u COPY\u EVERYTHING\u RIGHT\u
。然后,您应该找到负责写入时复制的代码,这取决于此标志是否已传递给
do_fork
:复制整个地址空间,或者(如果未传递此标志,则表明从原始系统调用之一调用了
do_fork
)使用现有的写入时复制策略。您的
dumbfork
系统调用看起来与
fork
调用几乎相同,除了附加标志

asmlinkage int sys_dumbfork(struct pt_regs *regs)
{
     return do_fork(CLONE_COPY_EVERYTHING_RIGHT_NOW | SIGCHLD, regs->sp, regs, 0, NULL, NULL);
}

页面虽然已经过时,但可能非常有用,尤其是Fork ICA写下即复制部分。在
fork
syscall
copy\u page\u range
期间调用了一个函数,该函数将页面标记为只读。这似乎是您应该考虑添加内存复制代码的地方。此外,在页面错误期间调用函数
do\u wp\u page
,以便复制以前共享的页面,这可能是一个很好的例子,说明这种复制应该是什么样子。

sys\u vfork
的作用与您想要的正好相反!!对,对。vfork将标志CLONE\u VM、CLONE\u vfork和SIGCHLD传递给do\u fork并共享地址空间。无论如何,vfork中的子项将执行exec或exit,因此这是有意义的。
sys\u vfork
的操作与您想要的正好相反!!对,对。vfork将标志CLONE\u VM、CLONE\u vfork和SIGCHLD传递给do\u fork并共享地址空间。无论如何,一个来自vfork的孩子会执行exec或exit,所以这是有意义的。谢谢你的回答,但我仍然没有得到详细的信息。你的意思是我需要修改Do_fork,以便可以使用新标志,并使用修改后的Do_fork而不是原始标志吗?要使用修改过的do_fork,我的新系统调用应该复制整个fork.c,对吗?我认为应该修改do_fork,这样它对原始系统调用(没有新标志,它应该以与以前相同的方式工作)和新系统调用(当标志通过时,它应该复制整个地址空间)都很有用。我更新了我的答案以使它更清晰。谢谢你的回答,但我仍然没有得到详细的信息。你的意思是我需要修改Do_fork,以便可以使用新标志,并使用修改后的Do_fork而不是原始标志吗?要使用修改过的do_fork,我的新系统调用应该复制整个fork.c,对吗?我认为应该修改do_fork,这样它对原始系统调用(没有新标志,它应该以与以前相同的方式工作)和新系统调用(当标志通过时,它应该复制整个地址空间)都很有用。我更新了我的答案以使它更清楚。