Binder主要涉及以下四個(gè)組成元素:
- Binder驅(qū)動(dòng)
- Service Manger
- Binder Client
- Binder Server
Binder的本質(zhì)就是進(jìn)程1希望與進(jìn)程2進(jìn)行交互肮街,它們之間必須借助Binder驅(qū)動(dòng)來實(shí)現(xiàn)通訊秃踩,Service Manner用于提供進(jìn)程的地址信息。
Binder驅(qū)動(dòng)
Binder驅(qū)動(dòng)是一個(gè)標(biāo)準(zhǔn)的Linux驅(qū)動(dòng)馋袜,具體而言黔攒,Binder Driver會(huì)把自己注冊(cè)成一個(gè)misc device偷拔,并向上層提供一個(gè)/dev/binder結(jié)點(diǎn)——Binder結(jié)點(diǎn)并不對(duì)應(yīng)真實(shí)的硬件設(shè)備,Binder驅(qū)動(dòng)運(yùn)行于內(nèi)核態(tài)亏钩,可以提供open()莲绰,ioctl(),mmap()等常用的文件操作姑丑。
使用流程:
1蛤签、打開Binder驅(qū)動(dòng)
層次進(jìn)程在訪問Binder驅(qū)動(dòng)時(shí),首先需要打開/dev/binder結(jié)點(diǎn)栅哀,這個(gè)操作最終實(shí)現(xiàn)的是binder_open()方法震肮。
2、內(nèi)存映射
對(duì)于應(yīng)用程序而言留拾,通過mmap()返回值得到一個(gè)內(nèi)存地址(虛擬地址)戳晌,這個(gè)地址通過虛擬內(nèi)存轉(zhuǎn)換(分段、分頁)后痴柔,最終會(huì)指向物理內(nèi)存的某個(gè)位置沦偎。
對(duì)于Binder驅(qū)動(dòng)而言,它有一個(gè)指針指向某個(gè)虛擬內(nèi)存地址,而經(jīng)過虛擬內(nèi)存轉(zhuǎn)換后豪嚎,它和應(yīng)用程序中指向的物理內(nèi)存處于同一個(gè)位置搔驼。
這時(shí)Binder和應(yīng)用程序就擁有了若干共用的物理內(nèi)存塊,當(dāng)兩個(gè)進(jìn)程共同指向相同的物理地址即可實(shí)現(xiàn)進(jìn)程間的數(shù)據(jù)共享侈询,且Binder驅(qū)動(dòng)只用了一次復(fù)制舌涨。
3、binder_ioctl
這是Binder驅(qū)動(dòng)實(shí)現(xiàn)業(yè)務(wù)的重要方法扔字,Binder并不提供read()和write()等文件操作囊嘉,最終由binder_ioctl來實(shí)現(xiàn)。
ServiceManger
ServiceManger的功能可以類比為互聯(lián)網(wǎng)中“DNS”服務(wù)器革为,“IP地址”為0扭粱,SM是一個(gè)標(biāo)準(zhǔn)的Binder Server,其他Binder Server向其注冊(cè)篷角,Binder Client向其請(qǐng)求并查詢服務(wù)的ID焊刹。
ServiceManger內(nèi)部維護(hù)著一個(gè)svclist列表系任,用于存儲(chǔ)所有的Server相關(guān)信息(以svcinfo為數(shù)據(jù)結(jié)構(gòu))恳蹲,查詢和注冊(cè)都是基于這個(gè)表展開的。
參考資料
- 深入理解Android內(nèi)核設(shè)計(jì)思想. 林學(xué)森俩滥。