通信過程:
binder設備驅動會爲每個進程分配一個數據結構binder_proc,每進程中的每個用到了binder通信的線程分配數據結構binder_thread。
binder設備驅動會爲服務進程中的每個服務對象分配數據結構binder_node,它隸屬於服務進程的binder_proc,即binder_node是binder_proc的子結構,binder_node中記錄了服務對象在服務進程中的地址;會爲客戶進程中每個引用分配binder_ref,binder_ref會指向客戶進程引用的服務對象的binder_node。
binder驅動爲客戶進程每個引用都會維護一個handle,它存在於binder_ref中(binder_ref.desc),它就像進程打開某個文件產生的文件描述符一樣,進程每引用一個服務,就會分配一個最小未使用的整數作爲handle。handle是客戶進程相關的,多個進程引用同一個服務得到的handle並不是一樣的。
當服務進程向ServiceManager註冊服務時,會帶上服務的名稱字符串,驅動會爲服務進程中的服務對象增加一個binder_node,歸屬於服務進程的binder_proc。
當把註冊服務的請求發給ServiceManager時,ServiceManager也是服務對象的一個引用者,驅動會爲ServiceManager增加一個binder_ref,指向服務對象的binder_node。驅動把binder_ref.desc(ServiceManager)作爲handle返回給ServiceManager,ServiceManager保存此handle和服務名稱字符串。
當客戶進程向ServiceManager獲取服務時,ServiceManager根據服務名稱字符串找到服務對象在ServiceManager進程中的handle。在ServiceManager的應答的過程中,驅動根據此handle在ServiceManager進程的binder_proc找到對應的binder_ref,並根據它找到服務對象的binder_node。然後,驅動會爲客戶進程增加一個binder_ref,指向服務對象的binder_node,最後把binder_ref.desc(客戶進程)作爲handle返回給客戶進程。
客戶進程使用得到的handle向服務進程發起請求,驅動會在根據此handle在客戶進程的binder_proc查找對應的binder_ref,並找到它指向的binder_node,並找到binder_node所屬的binder_proc,最終驅動把請求放入服務進程的接收隊列中。
服務進程收到請求後,從binder_node中找到服務對象的地址,然後調用該服務對象。所以,對於服務對象,在客戶進程中表現出來的是handle,在服務進程中表現出來的是地址,驅動會對它們進行映射。