linux clone函数ptid,pthread_create到ret_fast_syscalls 参数和栈的变化
=> 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 参数和栈的变化相关推荐
- Linux中的fork()和clone()函数
原文地址:https://blog.csdn.net/qq_42837885/article/details/101950162 fork函数 在linux中fork函数是非常重要的函数,它从已存在进 ...
- 类成员函数作为pthread_create函数参数
转自http://blog.csdn.net/luo6620378xu/article/details/8521940 近日需要将线程池封装成C++类,类名为Threadpool.在类的成员函数exe ...
- linux信号检查参数相同,linux信号函数
alarm(设置信号传送闹钟) 相关函数 signal,sleep 表头文件 #include 定义函数 unsigned int alarm(unsigned int seconds); 函数说明 ...
- linux 文件按时间 函数,[Linux文件属性]使用utime函数操作文件的时间参数
//这是一个使用utime函数对文件的时间参数进行修改的实例 //文件首先使用stat函数获得文件当前的时间参数,然后使用 //Open函数对文件进行修改,再用utime函数对文件的时间信息 //进行 ...
- linux c之使用pthread_create创建线程pthread_join等待线程和pthread_exit终止线程总结
1.介绍API 1.pthread_create函数 函数简介 pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int p ...
- linux应用调用内核函数,Hooking linux内核函数(一):寻找完美解决方案
前言 我们最近参与了一个Linux系统安全相关项目,需要hooking几个重要的Linux内核函数调用,例如打开文件和启动进程,并利用它来启用系统活动监控并抢先阻止可疑进程. 最后,我们发明了一种有效 ...
- Linux 创建目录函数mkdir
一.Linux 创建目录函数mkdir的mode设置问题 函数原型: #include <sys/stat.h> int mkdir(const char *path, mode_t mo ...
- linux signal函数用法,linux信号机制之sigaction构造体浅析,signal 函数,信号捕捉.
来自:http://hi.baidu.com/phenix_yw/blog/item/6eb4ca391d1479f23a87ce19.html 信号安装函数sigaction(int signum, ...
- Linux系统函数之IO函数
技术交流 QQ 群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.标准C库IO函数工作流程 IO缓冲区的作用? 大部分硬盘都是机械硬盘,读取寻道时间 ...
- linux C函数之strdup函数分析【转】
本文转载自:http://blog.csdn.net/tigerjibo/article/details/12784823 linux C函数之strdup函数分析 一.函数分析 1.函数原型: [c ...
最新文章
- JavaEE基础(十四) /正则
- 正点原子串口函数分析
- Vue 3 —— 当 data 和 ref 相同时 运行时错误 [ReferenceError: xxx is not defined]
- 全国计算机一级计算机基础及WPS考试题型,计算机一级考试科目有哪些?Wps和ms考试的题目一样吗?...
- python if高级用法_Python高级用法总结--元类
- 理解SimpleExpandableListAdapter的构造函数
- 基于大数据平台的异常检测场景分析方案
- 云闪付华为P9指纹_华为云闪付app指纹支付
- 没有Home键和End键怎么办?
- CF1437F Emotional Fishermen
- 支付宝小程序访问浙里办应用,提示页面访问受限,IOS无法访问
- 为自己加油!--ThoughtWorks面试后感
- PM00-愿景, 战略和项目
- Java程序设计-实验6-sdust
- 基于Linux 5.4.18的nvme驱动学习 - Linux相关概念 (一)
- vue实现单选做题根据对错标色,作对跳转下一题,实现思路详解
- 63家企业上榜!华为云优秀合作伙伴公布!
- PSPICE-AA灵敏度分析
- 【进阶开发】如何编译MaixPy工程
- 链接:https://ac.nowcoder.com/acm/problem/22228来源:牛客网题目描述 在给定的数组中删除一个数。输入描述:多组测试。每组第一行输入1个整数n(n