Android Framework學習筆記之Binder

Linux進程間通信的方式:
管道(Pipe)、信號(Signal)、消息隊列(Message)、共享內存(Share Memory)、套接字(Socket、中斷
Binder:
Binder 通信機制是在OpenBinder的基礎上實現的,採用CS通信方式。
OpenBinder是一種進程間通信機制,它最初是由Be公司開發的,後來由Palm公司接手開發和維護,最後Google公司對其進行改造,並應用在Android系統中。

1、系統服務是用過getSystemService獲取的服務,應用程序服務是通過繼承Service,程序員自己創建的
2、Android的SDK中提供了aidl工具,該工具可以講aidl文件轉換爲一個java類文件;例如我們定義一個IServer.aidl文件,aidl工具會自動生成一個IServer.java的java接口類(包含Stub,Proxy等內部類)。
3、前臺進程通過bindService綁定後臺服務進程時,onServiceConnected(ComponentName name, IBinder service)傳回IBinder對象,並且可以通過IServer.Stub.asInterface(service)獲取IServer的內部類Proxy的對象,其實現了IServer接口
4、前臺進程實際上市通過Proxy實現的IServer接口方法,將方法名、參數傳遞給後臺服務進程。
5、我們還需要繼承Service,創建自己的後臺服務進程,並且在其中實現IServer接口類,提供IServer的具體服務。並實現Service的onBind方法。

優點:
1、安全,傳統的IPC(套接字、管道、消息隊列)的安全機制依賴上層協議;例如:
a、Android爲每個安裝好的應用程序分配了自己的UID,故進程的UID是鑑別進程身份的重要標誌。
b、傳統IPC的接收方無法獲得對方進程可靠的UID/PID(用戶ID/進程ID),從而無法鑑別對方身份。   
c、使用傳統IPC只能由用戶在數據包裏填入UID/PID,但這樣不可靠,容易被惡意程序利用,故可靠的身份標記只有由IPC機制本身在內核中添加。
d、其次傳統IPC訪問接入點是開放的,無法建立私有通道。比如命名管道的名稱,system V的鍵值,socket的ip地址或文件名都是開放的,只要知道這些接入點的程序都可以和對端建立連接,不管怎樣都無法阻止惡意程序通過猜測接收方地址獲得連接。
2、性能高:傳統的IPC(套接字、管道、消息隊列)需要拷貝兩次內存、Binder只需要拷貝一次內存、共享內存不需要拷貝內存。

用戶空間與內核空間:
現在操作系統都是採用虛擬存儲器,那麼對32位操作系統而言,它的尋址空間(虛擬存儲空間)爲4G(2的32次方)。

操作系統的核心是內核,獨立於普通的應用程序,可以訪問受保護的內存空間,也有訪問底層硬件設備的所有權限。

爲了保證用戶進程不能直接操作內核(kernel),保證內核的安全,操作系統將虛擬空間劃分爲兩部分,一部分爲內核空間,一部分爲用戶空間。

針對linux操作系統而言,將最高的1G字節(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱爲內核空間,而將較低的3G字節(從虛擬地址0x00000000到0xBFFFFFFF),供各個進程使用,稱爲用戶空間。

MMAP:
一種是open一個文件,然後使用read系統調用讀取文件的一部分或全部。

這個read過程是這樣的:內核將文件中的數據從磁盤區域讀取到內核頁高速緩衝區,再從內核的高速緩衝區讀取到用戶進程的地址空間。這裏就涉及到了數據的兩次拷貝:磁盤->內核,內核->用戶態。

而且當存在多個進程同時讀取同一個文件時,每一個進程中的地址空間都會保存一份副本,這樣肯定不是最優方式的,造成了物理內存的浪費。

open一個文件,然後調用mmap系統調用,將文件的內容的全部或一部分直接映射到進程的地址空間,映射完成後,進程可以像訪問普通內存一樣做其他的操作,比如memcpy等等。

mmap並不分配物理地址空間,它只是佔有進程的虛擬地址空間。這跟普通方式不一樣的,普通方式需要預先分配好物理內存,內核才能將頁高速緩衝中的文件數據拷貝到用戶進程指定的內存空間中。

當多個進程需要同時訪問同一個文件時,每個進程都將文件所存儲的內核高速緩衝映射到自己的進程地址空間。

當第一個進程訪問內核中的緩衝區時候,前面講過並沒有實際拷貝數據,這時MMU在地址映射表中是無法找到與地址空間相對應的物理地址的,也就是MMU失敗,就會觸發缺頁中斷。內核將文件的這一頁數據讀入到內核高速緩衝區中,並更新進程的頁表,使頁表指向內核緩衝中的這一頁。之後有其他的進程再次訪問這一頁的時候,該頁已經在內存中了,內核只需要將進程的頁表登記並且指向內核的頁高速緩衝區即可。如下圖所示:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章