这不是历史原因,而是因为某些克隆的实现依赖于架构。像 h8300 这样的一些 CPU 在寄存器中传递的参数比在 kernel/fork.c 中找到的通用 sys_clone 包装器要多……它是使用 SYSCALL_DEFINE* 宏定义的:
在 4.13.5 中,它在 2133 行附近。
#ifdef __ARCH_WANT_SYS_CLONE
#ifdef CONFIG_CLONE_BACKWARDS
SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
int __user *, parent_tidptr,
unsigned long, tls,
int __user *, child_tidptr)
#elif defined(CONFIG_CLONE_BACKWARDS2)
SYSCALL_DEFINE5(clone, unsigned long, newsp, unsigned long, clone_flags,
int __user *, parent_tidptr,
int __user *, child_tidptr,
unsigned long, tls)
#elif defined(CONFIG_CLONE_BACKWARDS3)
SYSCALL_DEFINE6(clone, unsigned long, clone_flags, unsigned long, newsp,
int, stack_size,
int __user *, parent_tidptr,
int __user *, child_tidptr,
unsigned long, tls)
#else
SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
int __user *, parent_tidptr,
int __user *, child_tidptr,
unsigned long, tls)
#endif
{
return _do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr, tls);
}
#endif
在 h8300 的情况下,有一个特定于架构的 sys_clone,这是需要的,因为在 h8300 的情况下,参数从调用进程传递到分叉进程的方式必须通过寄存器传递所有参数(而不是寄存器和堆栈的混合)并且因为克隆会击败寄存器,所以它需要 cpu 特定的处理。