由__futex_syscall3略微展开

2024-01-04 01:20
文章标签 展开 略微 futex syscall3

本文主要是介绍由__futex_syscall3略微展开,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. __futex_syscall3 是啥

__futex_syscall3是android bionc库(一种libc库,为了不与开源组织冲撞,特地不采用glibc)。__futex_syscall3是android的一种线程管理函数。相当于wake。

该函数见于 /bionic/libc/bionic/pthread.c


int  __futex_wake_ex(volatile void *ftx, int pshared, int val)
{return __futex_syscall3(ftx, pshared ? FUTEX_WAKE : FUTEX_WAKE_PRIVATE, val);
}

和 bionic/libc/arch-arm/bionic/futex_arm.S

// __futex_syscall3(*ftx, op, val)
ENTRY(__futex_syscall3)mov     ip, r7ldr     r7, =__NR_futexswi     #0mov     r7, ipbx      lr
END(__futex_syscall3)

2. 具体看看

extern int __futex_syscall3(volatile void *ftx, int op, int val);
extern int __futex_syscall4(volatile void *ftx, int op, int val,
const struct timespec *timeout);
__futex_syscall3()相当于__futex_wake(),而__futex_syscall4()相当于__futex_wait()。这两个函数与前面的区别是能指定操作码op做为参数。操作码可以是FUTEX_WAIT,FUTEX_WAKE或者它们和FUTEX_PRIVATE_FLAG的组合。

3. 实际中看

之所以注意到该点,是因为调试用IDA 调试android应用的时候,当加载so库的时候,会自动停在下面的arm汇编代码处。

这里写图片描述
经过查看android源码,发现这其实就是存在于bionic/libc/arch-arm/bionic/futex_arm.S 的过程。但是对比起来确实不同。
但是自系思考,源码中用的寄存器ip,也就是R12寄存器的别名,这个寄存器承担内部调用的作用。当函数返回时然后重新恢复R7寄存器。
我们在看看IDA中实际的汇编代码,我们看到我们的谷歌NEXUS手机中用的stmfd sp!,{r4,r7}通过栈来保存寄存器的值,然后用ldmfd sp!,{r4,r7}来恢复寄存器的值。实际效果一样。

这篇关于由__futex_syscall3略微展开的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/567718

相关文章

通知Notification(可展开的大布局)使用,适配android8.0

补充修正: 2018-11-07 问题:Notification PendingIntent失效,每个通知都响应第一个PendingIntent https://blog.csdn.net/u013370255/article/details/83791750 2018-08-16 问题:app版本更新,通知形式显示安装包下载进度 https://blog.csdn.net/u01337025

vue3 行点击事件 table 树 点击行展开

需求:每次需要点击左侧小按钮才可以展开不方便,提出点击行就展开 el-table 添加 ref="tableDeptRef"@row-click="handleRowClick" 方法 const tableDeptRef = ref()/**行点击事件 */const handleRowClick=(row)=> {tableDeptRef.value.toggleRowExpa

zm-tree-org 数据量过大时,全部展开后,根节点点击收缩,树形消失

zm-tree-org 数据量过大时,全部展开后,根节点点击收缩,树形消失 <zm-tree-orgref="tree"@on-expand="onExpand"</zm-tree-org>export default {methods: {onExpand(e, data) {<!-- 当为根节点,且根节点为闭合时 -->if (data.root === true && data.expa

二叉树展开为列表(LeetCode)

题目 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。 解题 class TreeNode:def __init__(self, val=0, left=None, right=None):self.va

24.9.1(康托展开)

上星期三: 补 24牛客多校 二 C                                                  牛客传送门 思路: 赛时写模拟写的很臭,如果用dp写就很方便 代码如下: const int N=2e6+10;const int mod=1e9+7;ll n;char s[N][2];int dp[N][2];void solve(){c

leetcode 114:二叉树展开为链表

二叉树的题,使用递归的方式 TreeNode *last(TreeNode*root){while(root->right!=NULL){root=root->right;}return root;}TreeNode *fla(TreeNode *root){if(root==NULL)return NULL;if(root->left==NULL&&root->right==NULL)re

求幂级数展开的部分和 / 求分数序列前N项和 / 特殊a串数列求和

习题4-2 求幂级数展开的部分和   (20分) 已知函数e^xe​x​​可以展开为幂级数1+x+x^2 /2! + x^3 /3! + \cdots + x^k /k! + \cdots1+x+x​2​​/2!+x​3​​/3!+⋯+x​k​​/k!+⋯。现给定一个实数xx,要求利用此幂级数部分和求e^xe​x​​的近似值,求和一直继续到最后一项的绝对值小于0.00001。 输入格式:

JQ点击展开二级菜单

JQuery控制点击展开二级菜单,以下为测试代码: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  <html>      <head>          <title>JQ点击展开二级菜单</title>  <script class="jquery library" src="jquery-

Mutex类使用Futex实现同步

新书上市《深入解析Android 5.0系统》  以下内容节选自本书 下面我们将通过一个实际的例子来进一步的了解Futex的用法。前面我们介绍Bionic中的线程管理时介绍了pthread的临界区函数。临界区的实现中最重要的是上锁和解锁函数,下面我们看看它们的实现: 1.       在Bionic的实现中,pthread_mutex_lock()调用了内部函数_normal_lock()来

Futex用户态操作

新书上市《深入解析Android 5.0系统》  以下内容节选自本书 Futex的系统调用FUTEX_WAIT和FUTEX_WAKE只是用来挂起或者唤醒进程,Futex的同步机制还包括用户态下的判断操作。用户态下的操作没有固定的函数调用,只是一种检测共享变量的方法。下面将介绍如何将Futex用于临界区。 首先需要创建一个整型计数器作为Futex变量,如果是进程间同步,这个变量必须位