天天看點

Android IPC機制 Binder學習

目前學習binder已經一周了,一直想寫一些東西來的,但發現不管是原理還是源代碼自己都似懂非懂,還真寫不出來,,,今天有幸遇到一篇大神部落格,是binder機制系列部落格,逐漸解決了我的疑惑。當然有說的不對的地方,也請評論指正。

          大神系列網址:http://gityuan.com/2015/11/01/binder-driver/

          學習第一天,了解了下驅動這塊資料處理,解決疑惑如下:

          1.   以前看過别人寫的部落格,在Android 為什麼選擇binder進行IPC通信時候說過,binder性能僅次于複雜的共享記憶體,隻有一個資料拷貝???  但是我們知道,程序間資料通信都是需要binder driver的,(一般性的資料操作操作流程是: 先從使用者緩存區-》拷貝到核心緩存區-》拷貝到使用者緩存區) ,因為linux記憶體都隻有這樣的處理方式,copy_from_user()和copy_to_user()實作該功能,但是怎麼說binder機制就能實作一次拷貝就搞定這個問題呢?

           查找各種資料,說的都很模糊,,,說什麼核心空間到使用者空間映射什麼的,,,但想來想去,還是要經過binder driver才能實作該功能,怎麼會直接實作使用者态到使用者态的一次性拷貝呢?  其實是這樣的:

          首先在核心虛拟位址空間,申請一塊與使用者虛拟記憶體相同大小的記憶體;然後再申請1個page大小的實體記憶體,再将同一塊實體記憶體分别映射到核心虛拟位址空間和使用者虛拟記憶體空間,進而實作了使用者空間的Buffer和核心空間的Buffer同步操作的功能。

        然後要了解一下binder driver對于接收方資料接收緩存的管理。。。其中最主要的  

fd = open("/dev/binder", O_RDWR);

mmap(NULL, MAP_SIZE, PROT_READ, MAP_PRIVATE, fd, 0);

mmap()函數傳回的是記憶體映射在使用者空間的位址,不過這段空間是由驅動管理,使用者不必也不能直接通路(映射類型為PROT_READ,隻讀映射)。。。用來建立資料接收的緩存空間,但核心是在使用者态。。。。

        怎麼了解呢?  其實可以簡單把資料傳遞的拷貝流程了解為: 使用者空間拷貝到核心空間(實作一次拷貝,同時這個空間是位于使用者空間的,接收方當然可以通過指針直接調用),,,然後copy_to_user()時候,提供簡單的解放緩存,實作指針和指針資料偏移量傳遞就好了(因為使用者空間和核心空間有實體記憶體映射),這樣的資料傳遞是輕量級的,相當于沒有這樣的拷貝傳遞,,,,這樣就實作了一次拷貝,提高性能的問題。

     持續學習,準備完善好該篇文章。

繼續閱讀