Binder

Table of Contents

1. Binder

  • client

    我需要调用某个 stub 的函数, 参数我放在 parcel 里了, 等它返回结果了你把结果写到我提供的 reply 里.

  • kernel

    OK, 但是你要调用哪个函数?

  • client

    函数的地址我肯定是不知道的, 但我知道一个 desc 值 (一个 int), 你不是存在一个 binder_proc 么? 这个 desc 对应的 binder_ref 指向的 binder_node 应该有足够的信息

  • kernel

    对, binder_node->proc 存的 server 进程的 binder_proc, 而 binder_node->cookie 保存的就是 stub (BBinder) 的地址, 行了, 你回吧

  • client

    return…呃, 这个函数不是 ONE_WAY, 我需要回去等着结果…

    hey kernel, 我要回来了, 我需要等待结果

  • kernel

    OK, 你在你的 thread->wait 上等着吧

  • client

    zZ

  • kernel

    从 client 的 binder_proc 里根据 desc 找到 binder_ref, 根据 binder_ref 找到指向的 binder_node 和 node 所在的 binder_proc (target_binder_proc)

    对了, target_binder_proc->wait 这个 waitqueue 上应该有 binder_thread 正在 sleep, 好的, 就是它了.

    Hey, thread_1, 有个 client 要调用你那个进程提供的服务, 你需要的所有东西我都打包成一个 binder_transaction 放在你的 transaction_stack 上, 现在我把你唤醒, 你去看看吧

  • thread_1

    hmmm, 我看看, 它想调用的 BBinder 在这 (cookie), parcel 在这儿… let's go… ((BBinder*)cookie)->transact()

  • server

    transact()….完成. hey kernel, 我执行完了

  • kernel

    从 transaction_stack 上找到正在 zZ 的 client 并把它唤醒

  • client

Author: [email protected]
Date: 2017-03-31 Fri 00:00
Last updated: 2021-07-20 Tue 14:37

知识共享许可协议