binder service manager

ServiceManager

基于 Android 9.0 源码。
ServiceManager是Binder IPC通信过程中的守护进程,本身也是一个Binder服务,但并没有采用libbinder中的多线程模型来与Binder驱动通信,
而是自行编写了binder.c直接和Binder驱动来通信,并且只有一个循环binder_loop来进行读取和处理事务,这样的好处是简单而高效。

ServiceManager本身工作相对简单,其功能:查询和注册服务。 对于Binder IPC通信过程中,
其实更多的情形是BpBinder和BBinder之间的通信,比如ActivityManagerProxy和ActivityManagerService之间的通信等

涉及文件

./frameworks/native/cmds/servicemanager/binder.h
./frameworks/native/cmds/servicemanager/binder.c
./frameworks/native/cmds/servicemanager/service_manager.c
./frameworks/native/cmds/servicemanager/vndservicemanager.rc
./frameworks/native/cmds/servicemanager/servicemanager.rc

启动过程

通过 servicemanager.rc 启动 servicemanager 进程。
打开binder驱动,注册成为binder管理者,进入无线循环,读取处理client发来的请求

binder_open:
1. 打开binder驱动
2. 判断当前内核binder驱动版本和用户版本一致
3. 将一段内存从进程空间映射到内核空间

binder_become_context_manager:
1. 注册当前进程为binder服务管家

binder_loop:
1. 循环从binder驱动读取IPC数据处理

关键数据结构

struct binder_io;
struct svcinfo;
struct binder_death; // 存储death处理函数,和相应的 svcinfo

struct svcinfo * svclist; // 全局变量注册的service info列表

关键代码调用流程

main ==> binder_open
==> binder_become_context_manager
==> binder_loop(svcmgr_handler)

binder_open ==> fd = open("/dev/binder") ==> ioctl(fd, BINDER_VERSION, &vers) ==> mmap()

binder_become_context_manager ==> ioctl(fd, BINDER_SET_CONTEXT_MGR, 0)

binder_loop ==> binder_write(BC_ENTER_LOOPER)
==> for(;;)
==> ioctl(fd, BINDER_WRITE_READ, &bwr/*binder_write_read*/) ==> readbuf
==> binder_parse(readbuf, svcmgr_handler)

binder_parse ==> while(has data)
==> cmd ==> BR_TRANSACTION_COMPLETE
==> BR_TRANSACTION ==> ptr/binder_transaction_data txn
==> svcmgr_handler(txn, &msg, &reply)
==> binder_free_buffer / binder_send_reply
==> BR_REPLY ==> ptr/binder_transaction_data txn
==> BR_DEAD_BINDER ==> ptr/binder_death death
==> death->func(death)

binder_free_buffer ==> binder_write(BC_FREE_BUFFER, txn->data.ptr.buffer)

binder_send_reply ==> binder_write(BC_FREE_BUFFER, BC_REPLY)

binder_write ==> ioctl(fd, BINDER_WRITE_READ, &bwr)

svcmgr_handler(txn, msg, reply) ==> 校验合法
==> txn->code ==> SVC_MGR_GET_SERVICE/SVC_MGR_CHECK_SERVICE ==> do_find_service
==> SVC_MGR_ADD_SERVICE ==> do_add_service
==> SVC_MGR_LIST_SERVICES

do_find_service ==> find_svc(name) ==> svcinfo->handle

do_add_service ==> find_svc(name) ==> svcinfo_death/si->next = svclist;svclist = si
==> binder_acquire
==> binder_link_to_death

svcinfo_death ==> binder_release ==> binder_write(BC_RELEASE, svcinfo->handle)

binder_acquire ==> binder_write(BC_ACQUIRE, svcinfo->handle)

binder_link_to_death ==> binder_write(BC_REQUEST_DEATH_NOTIFICATION, handle, binder_death)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容