打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
DSDT是什么?

fork系统调用直接调用的就是

do_fork(CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHILD,

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

比较简单,syscall_call实际上是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    使用                                                                                

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
glibc中fork系统调用传参
Android执行系统调用的过程
关于linux系统如何实现fork的研究
ARM Linux系统调用
linux系统调用的来龙去脉(下)
linux C 调用系统接口安装模块 范例
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服