Binder通信采用C/S架構(gòu),從組件視角來說,包含Client赤套、Server飘痛、ServiceManager以及binder驅(qū)動(dòng)。架構(gòu)圖如下所示:
圖中的Client,Server,Service Manager之間交互都是虛線表示容握,是由于它們彼此之間不是直接交互的宣脉,而是都通過與Binder驅(qū)動(dòng)進(jìn)行交互的,從而實(shí)現(xiàn)IPC通信方式剔氏。
關(guān)于Binder驅(qū)動(dòng)設(shè)備
這部分涉及到Linux設(shè)備驅(qū)動(dòng)的開發(fā)塑猖,如有興趣可參考Binder系列1—Binder Driver初探。這里僅簡單闡述Binder驅(qū)動(dòng)的原理谈跛。
binder作為虛擬設(shè)備羊苟,沒有直接操作硬件,只是對(duì)設(shè)備內(nèi)存的處理感憾。主要完成以下幾件事
- 初始化(binder_init):創(chuàng)建/dev/binder設(shè)備節(jié)點(diǎn)
- 打開 (binder_open):獲取Binder Driver的文件描述
- 映射(binder_mmap):內(nèi)核中分配內(nèi)存蜡励,用于存放數(shù)據(jù)
- 數(shù)據(jù)操作(binder_ioctl):將IPC數(shù)據(jù)作為參數(shù)傳給Binder Driver
binder_open創(chuàng)建了一個(gè)對(duì)象保存當(dāng)前進(jìn)程信息,并將這個(gè)對(duì)象加入一個(gè)全局鏈表阻桅。
binder_mmap首先在內(nèi)核虛擬地址空間凉倚,申請(qǐng)一塊與用戶虛擬內(nèi)存相同大小的內(nèi)存;然后再申請(qǐng)1個(gè)page大小的物理內(nèi)存嫂沉,再將同一塊物理內(nèi)存分別映射到內(nèi)核虛擬地址空間和用戶虛擬內(nèi)存空間稽寒,從而實(shí)現(xiàn)了用戶空間的Buffer和內(nèi)核空間的Buffer同步操作的功能。
經(jīng)常聽說Binder進(jìn)程間通信的高效率趟章,正是源于binder_mmap瓦胎。通過Binder進(jìn)行進(jìn)程間通信時(shí),只會(huì)發(fā)生一次內(nèi)存拷貝尤揣。因?yàn)樯Π。?dāng)Client端與Server端發(fā)送數(shù)據(jù)時(shí),Client先從自己的進(jìn)程空間把IPC通信數(shù)據(jù)拷貝到內(nèi)核空間北戏,而Server與內(nèi)核共享數(shù)據(jù)负芋,不再需要拷貝數(shù)據(jù),而是通過內(nèi)存地址空間的偏移量嗜愈,即可獲悉內(nèi)存地址旧蛾,整個(gè)過程只發(fā)生一次內(nèi)存拷貝。
binder_ioctl負(fù)責(zé)在兩個(gè)進(jìn)程間收發(fā)IPC數(shù)據(jù)和IPC reply數(shù)據(jù)蠕嫁。
關(guān)于ServiceManager
- 本身也是一個(gè)的Server
- 主要職責(zé)是管理其他Server
- 是Binder機(jī)制的守護(hù)進(jìn)程
ServiceManager啟動(dòng)流程:
- 打開binder驅(qū)動(dòng)锨天,并調(diào)用mmap()方法分配128k的內(nèi)存映射空間
- 通知binder驅(qū)動(dòng)使其成為守護(hù)進(jìn)程
- 進(jìn)入循環(huán)狀態(tài),等待Client端的請(qǐng)求
ServiceManager可以做什么:
- 注冊(cè)服務(wù)(addService)
- 驗(yàn)證selinux權(quán)限剃毒,判斷進(jìn)程是否有權(quán)注冊(cè)或查看指定服務(wù)
- 如果服務(wù)已注冊(cè)病袄,則不再添加
- 注冊(cè)服務(wù)時(shí)搂赋,普通服務(wù)時(shí)作為Client,ServiceManager作為Server
- 獲取服務(wù)(getService)
- Client首先獲取ServiceManager
- 再通過字符串名稱來查找對(duì)應(yīng)的Service
-
defaultServiceManager()
是一個(gè)單例模式益缠,用于獲取ServiceMananger
總結(jié)
到此為止脑奠,已經(jīng)基本講明了ServiceManager和Binder。如果對(duì)于一個(gè)普通的Server怎么注冊(cè)和被獲取感興趣幅慌,還可繼續(xù)閱讀Binder系列5—注冊(cè)服務(wù)(addService)
和Binder系列6—獲取服務(wù)(getService)