我正在攻击linux-4.13.4,我从书中学习clone
系统调用
Linux内核开发第3版
我很好奇为什么{。3}在“./arch/h8300/kernel/process.c”中定义了?
这是我能找到函数定义的唯一地方。
在我看来,clone
系统调用的文件夹路径非常不一致。 clone
首先在架构h8300
中实施是一个历史原因,因此Linus Torvalds将clone
放入/arch/h8300/
?
参考:
https://www.classes.cs.uchicago.edu/archive/2006/winter/23000-1/docs/h8300.pdf
答案 0 :(得分:3)
这不是出于历史原因,而是因为克隆的某些实现取决于架构。某些CPU(如h8300)在寄存器中传递的参数多于sys_clone
中的通用kernel/fork.c
包装器......使用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的情况下,存在一个特定于arch的sys_clone,这是必需的,因为在h8300的情况下参数从调用进程传递到分叉进程的方式所有参数都必须通过寄存器(而不是混合寄存器和堆栈)并且因为克隆会破坏它需要cpu特定处理的寄存器。