2

当我通过传递 0 作为 stack_start 来调用克隆系统调用时会发生什么?根据克隆上的手册页,它应该返回-EINVAL,但是当我这样做时,它显示SIGSEGV (11)错误。

clone(func,NULL,0,args);

应该返回-EINVAL,但它失败了SIGSEGV

4

1 回答 1

1

根据linux内核有这样一个调用链:

sys_clone(...stack_start...) ->do_fork

do_fork(...stack_start...) ->copy_process

复制进程(...stack_start...) ->copy_thread

X86_32 上的 copy_thread(...stack_start...) 或 X86_64 上的copy_thread (...stack_start...)

查看copy_thread导致我假设由于此函数不检查stack_start正确性(代码中的 sp 参数),因此在克隆后我们有一个具有无效堆栈指针的任务,并且在零地址处的第一个引用导致SIGSEGV.

我建议你也看看克隆函数的 glibc 包装器。

于 2012-10-12T11:19:45.977 回答