=> create_thread (struct pthread *pd, const struct pthread_attr

*attr,STACK_VARIABLES_PARMS)

3. create_thread (struct pthread *pd, const struct pthread_attr *attr,STACK_VARIABLES_PARMS)

* pd :

pthread_t *tid  =>  ALLOCATE_STACK  分配并初始化

* attr:

default_attr

* STACK_VARIABLES_PARMS:

user thread stack (pd -1)

=> int res = do_clone (pd, attr, clone_flags, start_thread,STACK_VARIABLES_ARGS, 1);

4. static int do_clone (struct pthread *pd, const struct pthread_attr *attr,

int clone_flags, int (*fct) (void *), STACK_VARIABLES_PARMS, int stopped)

* clone_flags:

int clone_flags = (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGNAL

| CLONE_SETTLS | CLONE_PARENT_SETTID

| CLONE_CHILD_CLEARTID | CLONE_SYSVSEM

* fct :

start_thread => /* Run the code the user provided.  */

THREAD_SETMEM (pd, result, pd->start_routine (pd->arg));

* stopped

* 其他同上

=> ARCH_CLONE (fct, STACK_VARIABLES_ARGS, clone_flags,

pd, &pd->tid, TLS_VALUE, &pd->tid)

5.  ENTRY(__clone) :

int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,

pid_t *ptid, struct user_desc *tls, pid_t *ctid);

R0 => fct (start_thread ,function pointer)

R1 => STACK_VARIABLES_ARGS (user thread stack pointer)

R2 => clone_flags

R3 => pd  (pthead pointer)

user sp => &pd->tid      (ptid pointer)

user sp -4 => TLS_VALUE  (pd+1, tls start addr)

user sp -8 => &pd->tid      (ctid pointer)

R0 <= R2  (clone_flags)

R1 <= R1  STACK_VARIABLES_ARGS (user thread stack pointer)

R2 <= user sp  (ptid pointer)

R3 <= user sp -4 (TLS_VALUE)

R4 <= user sp -8  (ctid pointer)

=> R7 <= sys_clone_wrapper (120)

swi 0

user :

-----------------------------------------------------------------------------------

kernel :

1.     ENTRY(vector_swi)

* 开始构建 c 函数 sys_clone的栈:

High addr:

(FD 栈)

|    ......          |

|--------------------|

上次user sp --->  |    xxxx            |

|--------------------|

ARM_ORIG_r0 --->  |    R0              |

|--------------------|                                          A

ARM_cpsr    --->  |    spsr            |      swi 前的cpsr (user 下的)            |

|--------------------|                                          |

ARM_pc      --->  | swi 指令下一条地址 |                                 #S_FRAME_SIZE

|--------------------|                                          |

ARM_lr      --->  |    LR_usermode     |                                          |

|--------------------|                                          |

ARM_sp      --->  |    SP_usermode     |                                          |

|--------------------|                                          |

ARM_ip      --->  |     R12            |       R12-R1                             |

|     ...            |                                          |

|     ...            |                                          |

ARM_r1      --->  |     R1             |                                          |

|--------------------|                                          V

ARM_r0      --->  |     R0             |

|--------------------|

syscall参数6--->  |    R5              |

|--------------------|

syscall参数5--->  |    R4              |

|--------------------|

Low addr

根据上面的栈

a. syscall 时kernel 栈上ARM_r0和ARM_ORIG_r0 看起来是一样的内容

其他异常不一样

b.  syscall 最大参数 6个放到R0-R5,在具体call kernel 函数前,总认为

传了6个,所以按规则 参数1-4放 R0-R1, 参数5,6压栈

* 根据 scno (R7) 查表到sys_clone_wrapper跳转执行

cmp scno, #NR_syscalls  @ check upper syscall limit

adr lr, ret_fast_syscall  @ return address   @ 注意返回到ret_fast_syscall

在执行完 sys_clone_wrapper后

ldrcc  pc, [tbl, scno, lsl #2]  @ call sys_* routine

2.  sys_clone_wrapper

因为sys clone 没有6个参数,所以根据时间情况调整 上面的栈:

ARM_r0      --->  |   上面不变        |

|--------------------|

syscall参数--->  |  pt_regs *         |   从R5 改变为上面 pt_regs 所指地址

|--------------------|

syscall参数5--->  |    R4              |

|--------------------|

3.  执行 c 函数 sys_clone:

int sys_clone(unsigned long clone_flags(R0), unsigned long newsp(R1),

int __user *parent_tidptr(R2), int tls_val(R3),

int __user *child_tidptr(svc sp), struct pt_regs *regs (svc sp-4))

4. sys_clone 返回 执行 ret_fast_syscall

如果没有发生调度,那么

恢复swi 前所有用户上下文,并获取 arm_pc (值为swi 0下面那句)

栈如下:

|    ......          |

|--------------------|

上次user sp --->  |    xxxx            |

|--------------------|

下面的部分全部出栈了

linux clone函数ptid,pthread_create到ret_fast_syscalls 参数和栈的变化相关推荐

  1. Linux中的fork()和clone()函数

    原文地址:https://blog.csdn.net/qq_42837885/article/details/101950162 fork函数 在linux中fork函数是非常重要的函数,它从已存在进 ...

  2. 类成员函数作为pthread_create函数参数

    转自http://blog.csdn.net/luo6620378xu/article/details/8521940 近日需要将线程池封装成C++类,类名为Threadpool.在类的成员函数exe ...

  3. linux信号检查参数相同,linux信号函数

    alarm(设置信号传送闹钟) 相关函数 signal,sleep 表头文件 #include 定义函数 unsigned int alarm(unsigned int seconds); 函数说明 ...

  4. linux 文件按时间 函数,[Linux文件属性]使用utime函数操作文件的时间参数

    //这是一个使用utime函数对文件的时间参数进行修改的实例 //文件首先使用stat函数获得文件当前的时间参数,然后使用 //Open函数对文件进行修改,再用utime函数对文件的时间信息 //进行 ...

  5. linux c之使用pthread_create创建线程pthread_join等待线程和pthread_exit终止线程总结

    1.介绍API 1.pthread_create函数 函数简介 pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int p ...

  6. linux应用调用内核函数,Hooking linux内核函数(一):寻找完美解决方案

    前言 我们最近参与了一个Linux系统安全相关项目,需要hooking几个重要的Linux内核函数调用,例如打开文件和启动进程,并利用它来启用系统活动监控并抢先阻止可疑进程. 最后,我们发明了一种有效 ...

  7. Linux 创建目录函数mkdir

    一.Linux 创建目录函数mkdir的mode设置问题 函数原型: #include <sys/stat.h> int mkdir(const char *path, mode_t mo ...

  8. linux signal函数用法,linux信号机制之sigaction构造体浅析,signal 函数,信号捕捉.

    来自:http://hi.baidu.com/phenix_yw/blog/item/6eb4ca391d1479f23a87ce19.html 信号安装函数sigaction(int signum, ...

  9. Linux系统函数之IO函数

    技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.标准C库IO函数工作流程 IO缓冲区的作用? 大部分硬盘都是机械硬盘,读取寻道时间 ...

  10. linux C函数之strdup函数分析【转】

    本文转载自:http://blog.csdn.net/tigerjibo/article/details/12784823 linux C函数之strdup函数分析 一.函数分析 1.函数原型: [c ...

最新文章

  1. JavaEE基础(十四) /正则
  2. 正点原子串口函数分析
  3. Vue 3 —— 当 data 和 ref 相同时 运行时错误 [ReferenceError: xxx is not defined]
  4. 全国计算机一级计算机基础及WPS考试题型,计算机一级考试科目有哪些?Wps和ms考试的题目一样吗?...
  5. python if高级用法_Python高级用法总结--元类
  6. 理解SimpleExpandableListAdapter的构造函数
  7. 基于大数据平台的异常检测场景分析方案
  8. 云闪付华为P9指纹_华为云闪付app指纹支付
  9. 没有Home键和End键怎么办?
  10. CF1437F Emotional Fishermen
  11. 支付宝小程序访问浙里办应用,提示页面访问受限,IOS无法访问
  12. 为自己加油!--ThoughtWorks面试后感
  13. PM00-愿景, 战略和项目
  14. Java程序设计-实验6-sdust
  15. 基于Linux 5.4.18的nvme驱动学习 - Linux相关概念 (一)
  16. vue实现单选做题根据对错标色,作对跳转下一题,实现思路详解
  17. 63家企业上榜!华为云优秀合作伙伴公布!
  18. PSPICE-AA灵敏度分析
  19. 【进阶开发】如何编译MaixPy工程
  20. 链接:https://ac.nowcoder.com/acm/problem/22228来源:牛客网题目描述 在给定的数组中删除一个数。输入描述:多组测试。每组第一行输入1个整数n(n

热门文章

  1. Selenium Automated test 02 - Open browser
  2. 服务站: WCF 消息传递基础 -- MSDN Magazine, April 2007
  3. HDFS的java API操作(基于Windows平台的Eclipse)
  4. vscode添加vue文件模板
  5. 八、Python 之内置函数(。。。)
  6. saltstack之nginx、php的配置
  7. windows Hadoop环境搭建之一---软件准备
  8. 五、K8s pod相关操作(1)
  9. IPSec Over GRE和GRE Over IPSec技术
  10. GRE tunnel 2