gpt4 book ai didi

c - 为什么在 "sys_clone"中定义了 "./arch/h8300/kernel/process.c"?

转载 作者:太空狗 更新时间:2023-10-29 11:49:21 25 4
gpt4 key购买 nike

我正在hack linux-4.13.4,我从书上学习了clone系统调用

Linux Kernel Development 3rd Edition

我很好奇为什么sys_clone在“./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

https://en.wikipedia.org/wiki/H8_Family

最佳答案

不是历史原因,是因为clone的一些实现依赖于架构。一些 CPU,如 h8300,​​在寄存器中传递的参数比在 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,这是必需的,因为参数从调用进程传递到 fork 进程的方式在 h8300 的情况下,所有参数都必须通过寄存器传递(而不是通过寄存器传递)寄存器和堆栈的混合)并且因为克隆会破坏寄存器,所以它需要 cpu 特定处理。

关于c - 为什么在 "sys_clone"中定义了 "./arch/h8300/kernel/process.c"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46879426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com