binder一次跨進程通信,只須要一次拷貝(緣由後面會解析),而通常的像socket通信則須要兩次拷貝;socket
用戶和內核空間分配了一段虛擬地址,這段虛擬地址將用於binder內存的訪問。binder的物理內存頁由binder驅動負責分配,而後這些物理頁的訪問,將分爲進程的用戶空間和進程內核空間。因爲進程的用戶空間和內核空間的虛擬地址範圍是不同的,因此這裏分配的一段虛擬地址將包括進程的用戶空間地址和內核空間地址
內核剛開始只是分配了一個物理頁,而且分別將這個物理頁映射到進程的內核虛擬地址空間V1(修改內核空間的頁表映射)和進程的用戶虛擬地址空間V2(修改用戶空間的頁表映射)。在用戶空間訪問V1和在內核空間訪問V2,其實都是訪問的是同一個物理內存塊,從而實現進程的內核和用戶空間共享同一塊物理內存的目的。這樣binder驅動在內核空間,將一段數據拷貝到這個物理頁,則該進程的用戶空間則不須要copy_to_user()便可以同步看到內核空間的修改,並可以訪問這段物理內存.進程