1漠秋、binder是什么
進(jìn)程間通信
也是一個(gè)驅(qū)動(dòng)
binder.java ->實(shí)現(xiàn)IBinder --跨進(jìn)程能力
WebView ,音視頻播放笙蒙、音樂(lè)、大圖瀏覽庆锦、推送
系統(tǒng)服務(wù):打電話手趣、鬧鐘等
2、優(yōu)點(diǎn)
內(nèi)存
風(fēng)險(xiǎn)隔離
linux進(jìn)程間通信:管道肥荔,信號(hào)量绿渣,soket、共享內(nèi)存
mmap()--能夠讓虛擬內(nèi)存和指定物理內(nèi)存直接聯(lián)系起來(lái)
共享內(nèi)存怎么實(shí)現(xiàn)無(wú)需copy的 燕耿? 接收方-內(nèi)核-發(fā)送方共享一塊內(nèi)存中符,所以無(wú)需copy
binder驅(qū)動(dòng)啟動(dòng)
linux文件(一切皆文件)
binder_init
1、分配內(nèi)存
2誉帅、初始化設(shè)備
3淀散、放入鏈表 binder_devices
binder_open
1、創(chuàng)建binder_proc對(duì)象
2蚜锨、當(dāng)前進(jìn)程信息 proc
3档插、filp->private_data = proc;
4、添加到binder_procs 鏈表中
struct vm_struct *area;//內(nèi)核到虛擬內(nèi)存
via //進(jìn)程的虛擬內(nèi)存 4M是驅(qū)動(dòng)定的亚再,應(yīng)用定的是1M-8k
虛擬內(nèi)存--放入一個(gè)東西
用戶空間 = 虛擬內(nèi)存地址+偏移量
分配4Kb的物理內(nèi)存---內(nèi)核的虛擬空間
默認(rèn) 同步
tf_oneway
binder_mmap
1郭膛、通過(guò)用戶空間的的虛擬內(nèi)存大小---分配一塊虛擬內(nèi)存
2、分配一塊物理內(nèi)存4KB
3氛悬、把這塊物理內(nèi)存地址分別映射到则剃,用戶空間的虛擬內(nèi)存和內(nèi)核的虛擬內(nèi)存
binder_iocol
讀寫操作
ServiceManger.c main()開始
1耘柱、打開驅(qū)動(dòng) 設(shè)置大小(128*1024),內(nèi)存映射
2棍现、設(shè)置SM為大管家调煎。sm為了管理系統(tǒng)服務(wù)
1、創(chuàng)建了binder_node對(duì)象
2己肮、proc -> binder_node
3士袄、創(chuàng)建了work和 todo隊(duì)列 類似MessageQueue
3、BC_ENTER_LOOPER
1谎僻、寫入狀態(tài)loop
2娄柳、去讀數(shù)據(jù):binder_thread_read(): ret = wait_event_freezable_exclusive(proc->wait, binder_has_proc_work(proc, thread);進(jìn)入等待
獲取sm的情況
1、注冊(cè)到服務(wù)
2戈稿、通過(guò)sm去獲取服務(wù)
也是服務(wù)端
1西土、ProcessState::self()->getContextObject(NULL)
1.1、 ProcessState::self()
1.1.1鞍盗、open_driver 打開驅(qū)動(dòng) binder設(shè)備
1.1. 2需了、設(shè)置最大線程數(shù)15個(gè)
1.1.3、mmap :設(shè)置共享內(nèi)存大小--> 普通服務(wù)的大小般甲。1M-8k
1.2肋乍、getContextObject(NULL)
1.2.1、創(chuàng)建一個(gè)BpBinder ---客戶端的對(duì)象
2敷存、interface_cast
2.1墓造、new BpServiceManager(new BpBinder)
2.2、remote.transact--- 遠(yuǎn)程調(diào)用
2.3锚烦、remote == BpBinder
3觅闽、java層
3.1、new ServiceManagerProxy(new BinderProxy)
3.2 涮俄、mReomte == BinderProxy
3.3蛉拙、BinderProxy.mObject == BpBinder
3.4、mRemote.transact == BpBinder.transact