【问题标题】:invoking do_fork with copy-on-write disabled在禁用写时复制的情况下调用 do_fork
【发布时间】:2012-03-05 04:42:24
【问题描述】:

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

【问题讨论】:

  • sys_vfork 与您想要的完全相反!
  • 是的,没错。 vfork 将标志 CLONE_VM、CLONE_VFORK 和 SIGCHLD 传递给 do_fork 并共享地址空间。无论如何,来自 vfork 的孩子会执行 exec 或 exit,所以这是有道理的。

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


【解决方案1】:

do_fork 是一个非常通用的函数,用于fork、vfork 和clone 调用。与你想要实现的最相似的显然是fork(clone 主要用于线程,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 和 Copy on Write 部分。在fork 系统调用copy_page_range 期间调用了一个函数,它将页面标记为只读。这看起来像是您应该考虑添加内存复制代码的地方。此外,函数 do_wp_page 在页面错误期间被调用,以便复制某人想要写入的先前共享页面,这可能是一个很好的例子,这种复制应该是什么样子。

【讨论】:

  • 感谢您的回答,但我仍然没有详细了解。你的意思是我需要修改do_fork,所以可以使用新的flag,用修改后的do_fork代替原来的?要使用修改后的 do_fork,应该为我的新系统调用复制整个 fork.c,对吧?
  • 我认为你应该修改 do_fork 以便它对原始系统调用(没有新标志它应该以与以前相同的方式工作)和你的新系统调用(当标志通过它应该复制整个地址空间)。为了更清楚,我更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 1970-01-01
  • 2018-07-01
相关资源
最近更新 更多