Client与Service的通信
2020-06-17 14:53:46 24 举报
Client与Service通信
作者其他创作
大纲/内容
buffer.ipcSetDataReference() 解析数据
put_user(BR_TRANSACTION_COMPLETE)
蓝色:数据流紫色:Binder驱动创建数据结构绿色:表示reply的流程与请求差异的地方,大体流程是一样的。binder.c是在内核空间,用两个是区分不同进程的内核态。
binder_thread_read()
回到waitForResponse
BpMediaPlayerService
joinThreadPool()
IPCThreadState
talkWithDriver()
创建binder_transaction t,binder_work tcomplete并初始化
waitForResponse()
清空已写的数据
将t-work添加到target_list队列中
创建binder_ref,添加到target_proc - refs_by_node
依次循环读出BR_NOOP
唤醒target进程
回到getAndExecuteCommand()
进入内核空间
binder.c
从binder_wait_for_work(thread)醒来
BC_REPLY_SG
将tcomplete添加到thread-todo队列中
BnMediaPlayerService::onTransact()
writeInt32(audioSessionId)
getAndExecuteCommand()
执行copy_to_user()将数据拷贝到用户空间
executeCommand(BR_TRANSACTION)
读出数据到mIn
循环这时,write为0,read0,中断等待reply数据
BBinder-onTransact()
2.binder_thread_read()
BpBinder
根据handle找到target_node
case BINDER_WORK_TRANSACTION_COMPLETE
BR_REPLY
transact(mHandle)
cmd改为BR_TRANSACTION
解析t的数据,并拷贝到用户空间
binder_transaction()
BBinder-transact()
设置已读数据
binder_get_thread(proc)
1.binder_thread_write(BC_TRANSACTION)
copy_from_user()
封装data
put_user(BR_NOOP)
finish,层层上报回到调用请求的位置
进入Service用户空间
创建binder_node,添加到proc-nodes
设置回复信息
从thread的todo取出work,并将work转化成binder_transaction t
Parcel
依次循环读出BINDER_WORK_TRANSACTION_COMPLETE
copy_to_user(bwr)
回到binder_ioctl()中
Client用户空间
回到Client用户空间talkWithDrive()
sendReply(reply)
收藏
收藏
0 条评论
回复 删除
下一页