获取service
2020-06-17 14:52:48 10 举报
获取Service流程
作者其他创作
大纲/内容
binder_write()
binder_thread_read()
put_user(BR_TRANSACTION_COMPLETE)
蓝色:数据流紫色:Binder驱动创建数据结构binder.c是在内核空间,用两个是区分不同进程的内核态。
BpServiceManager
回到waitForResponse
binder_loop()
servicemanager/binder.c
memcmp()
创建binder_transaction t,binder_work tcomplete并初始化
waitForResponse()
将t-work添加到target_list队列中
SVC_MGR_CHECK_SERVICE
binder_parse()
创建binder_ref,添加到target_proc - refs_by_node
取出BR_TRANSACTION
唤醒target进程
依次循环读出BR_NOOP
指令BC_FREE_BUFFER和BC_REPLY
talkWithDriver()
bio_get_ref()
binder.c
从binder_wait_for_work(thread)醒来
将tcomplete添加到thread-todo队列中
writeString16(name)
svcmgr_handler()
Client用户空间
执行copy_to_user()将数据拷贝到用户空间
循环这时,write为0,read0,中断等待reply数据
回到Client用户空间talkWithDrive()
2.binder_thread_read()
读出数据到mIn
BpBinder
根据handle找到target_node
case BINDER_WORK_TRANSACTION_COMPLETE
transact(mHandle)
cmd改为BR_TRANSACTION
解析t的数据,并拷贝到用户空间
binder_transaction()
设置已读数据
binder_get_thread(proc)
1.binder_thread_write(BC_TRANSACTION)
IPCThreadState
copy_from_user()
memcpy()
封装data
put_user(BR_NOOP)
bio_init_from_txn()来初始化msg
getService(name)
进入service用户空间
finish,层层上报回到调用请求的位置
创建binder_node,添加到proc-nodes
设置回复信息
清空已写的数据
从thread的todo取出work,并将work转化成binder_transaction t
Parcel
BR_REPLY
checkService()
进入内核空间
依次循环读出BINDER_WORK_TRANSACTION_COMPLETE
binder_send_reply()
do_find_service
bio_init()初始化reply
copy_to_user(bwr)
回到binder_ioctl()中
收藏
收藏
0 条评论
下一页