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
…