调用do_fork并禁用写入时复制

时间:2012-03-05 04:42:24

标签: kernel system-calls copy-on-write

我正在进行操作系统分配,即添加新的系统调用。系统调用(称为“dumbfork”)需要在不使用写时复制策略的情况下分叉进程。所以基本上它必须将整个地址空间复制到子进程。

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

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

1 个答案:

答案 0 :(得分:0)

do_fork是一种非常通用的功能,可用于forkvforkclone来电。与您想要实现的最相似的是forkclone主要用于线程,vfork根本不复制地址空间。

在您的情况下,最佳解决方案似乎是让do_fork接受新标志,例如CLONE_COPY_EVERYTHING_RIGHT_NOW。然后你应该找到负责写入时复制的代码,并取决于这个标志是否传递给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);
}

This页面虽然已过时,但可能非常有用,尤其是 Fork ICA 写入时复制部分。在fork系统调用copy_page_range期间调用了一个函数,该函数将页面标记为只读。这看起来像你应该考虑添加内存复制代码的地方。此外,在页面错误期间调用函数do_wp_page以便复制某人想要写入的先前共享页面,这可能是这种复制应该是什么样子的一个很好的例子。