2

我正在做一个操作系统分配,它正在添加一个新的系统调用。称为“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);
}
4

1 回答 1

0

do_fork是一个非常通用的函数,用于fork,vforkclone调用。显然,与您想要实现的最相似的是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);
}

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

于 2012-03-05T19:27:32.303 回答