fork 至 “sys_clone" SyS_clone

本文详细解析了glibc-2.17中fork系统的具体实现,包括其等价的sys_clone调用方式,以及内部执行流程。通过分析宏定义和系统调用过程,揭示了fork与sys_clone之间的关系,并阐述了它们在不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:glibc-2.17中fork的相应系统调用是sys_clone及SyS_clone。有人说调用的是sys_fork,但是我持否定意见,如果我们向真的来发起系统调用可以使用syscall。

fork系统调用等价于直接调用的就是

do_fork(CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHILD,

             NULL, NULL, NULL, &THREAD_SELF->tid)。&THREAD_SELF->tid放在svc状态下的栈上,前四个参数在r0~r3中。

比较简单,sys_clone实际上是SyS_clone

__vectors_start:
#....
        W(ldr)  pc, .LCvswi + stubs_offset  //将vector_swi的标号值给pc
#....

.LCvswi:
    .word   vector_swi                                                                                             

 

swi流程

sys_call_table:

CALL(sys_clone)                                                                                

sys_clone与SyS_clone的关系

SYSCALL_ALIAS(sys##name, SyS##name); 

#define SYSCALL_ALIAS(alias, name) \ 
    asm ( #alias " = " #name "\n\t.globl " #alias)

SyS_clone何时触发了do_fork()

#define __SYSCALL_DEFINEx(x, name, ...)                 \
    asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));  \
    static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));  \
    asmlinkage long SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))   \
    {                               \
        long ret = SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__));  \
        __MAP(x,__SC_TEST,__VA_ARGS__);             \
        __PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__));   \
        return ret;                     \
    }                               \
..........

static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))                                                  
{
    return do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr);
}

 

先参考http://www.cnblogs.com/openix/archive/2012/02/25/2367557.html

下面抽取了细节,有点繁琐,主要是一些宏的使用(可变“参数”的宏,宏的字符串转化,宏粘贴),方法倒是蛮好的:

SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
         int __user *, parent_tidptr,
         int __user *, child_tidptr,
         int, tls_val)
{
    return do_fork(clone_flags, newsp, 0, parent_tidptr, child_tidptr);
}

 

#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__) 

#define SYSCALL_DEFINEx(x, sname, ...)              \
    __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)


#define __SYSCALL_DEFINEx(x, name, ...)       \
asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__));  \
    static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));  \
    asmlinkage long SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))   \
    {                               \
        long ret = SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__));  \
        __MAP(x,__SC_TEST,__VA_ARGS__);             \
        __PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__));   \
        return ret;                     \
    }                               \
    SYSCALL_ALIAS(sys##name, SyS##name); \
static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__)

 

如何__MAP的实现

#define __SC_STR_TDECL(t, a)  #t 
#define __SC_STR_TDECL(t, a) #a #define __SC_DECL(t, a) t a #define __SC_CAST(t, a) (t)a #define __SC_LONG(t, a) \
__typeof(__builtin_choose_expr( __TYPE_IS_LL(t), 0LL, 0L)) a #define __same_type(a, b) \
__builtin_types_compatible_p(typeof(a), typeof(b)) #define __TYPE_IS_LL(t) \
(__same_type((t)0, 0LL) || __same_type((t)0, 0ULL)) #define __MAP0(m, ...) #define __MAP1(m, t, a) m(t, a) #define __MAP2(m, t, a, ...) m(t, a), __MAP1(m, __VA_ARGS__) #define __MAP3(m, t, a, ...) m(t, a), __MAP2(m, __VA_ARGS__) #define __MAP4(m, t, a, ...) m(t, a), __MAP3(m, __VA_ARGS__) #define __MAP5(m, t, a, ...) m(t, a), __MAP4(m, __VA_ARGS__) #define __MAP6(m, t, a, ...) m(t, a), __MAP5(m, __VA_ARGS__) #define __MAP(n, ...) __MAP##n(__VA_ARGS__)

 

关于汇编中的宏,可以有默认参数,参考arm的kernel中  ct_user_exit    使用。                                                                            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值