我正在进行操作系统分配,即添加新的系统调用。系统调用(称为“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);
}
答案 0 :(得分:0)
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 和写入时复制部分。在fork
系统调用copy_page_range
期间调用了一个函数,该函数将页面标记为只读。这看起来像你应该考虑添加内存复制代码的地方。此外,在页面错误期间调用函数do_wp_page
以便复制某人想要写入的先前共享页面,这可能是这种复制应该是什么样子的一个很好的例子。