Binder客户端和驱动端通信流程实例分析----以acquireWakeLock()函数为例 (二)

本文深入剖析Android Binder通信机制,以acquireWakeLock()为例,详细阐述从应用层到驱动层的交互过程,包括IPCThreadState的transact()、talkWithDriver()函数,以及在Linux内核中的ioctl()调用路径,最终解释Binder驱动如何处理事务。

在上一篇文章《Binder客户端和驱动端通信流程实例分析----以acquireWakeLock()函数为例(一)》中,我们介绍了亮屏锁WakeLock类的acquire()函数如何将Binder请求从app上层一步步向下传递到frameworknative层的IPCThreadState类的transact()函数。

IPCThreadState类的transact()函数主要做的事情如下:

1. 调用IPCThreadState::writeTransactionData()函数把包含Binder请求信息的parcel内容拆解重组到一个binder_transaction_data结构体的变量中,再把命令码cmd和binder_transaction_data写入到mOut变量,mOut变量在后续的处理中将被包含在一个binder_write_read结构体变量中,通过ioctl()传给Binder驱动;

2. 调用IPCThreadState::waitForResponse()进入一个与Binder驱动进行沟通的while循环,该循环主要代码如下(因篇幅所限,进行了缩略):

    while (1) {
        if ((err=talkWithDriver()) < NO_ERROR) break;
        	err = mIn.errorCheck();
        if (err < NO_ERROR) break;
        if (mIn.dataAvail() == 0) continue;
        cmd = (uint32_t)mIn.readInt32();
        switch (cmd) {
        case BR_TRANSACTION_COMPLETE:
            if (!reply && !acquireResult) goto finish;
            break;
        case BR_DEAD_REPLY:
            err = DEAD_OBJEC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值