Android知識鞏固 Binder

2021-09-11 11:25:01 字數 2269 閱讀 1779

乙個程序空間分為 使用者空間 & 核心空間(kernel),即把程序內 使用者 & 核心 隔離開來

程序內 使用者 與 核心 進行互動 稱為系統呼叫

程序隔離:程序隔離是為保護作業系統中程序互不干擾而設計的一組不同硬體和軟體的技術。這個技術是為了避免程序a寫入程序b的情況發生。 程序的隔離實現,使用了虛擬位址空間。程序a的虛擬位址和程序b的虛擬位址不同,這樣就防止程序a將資料資訊寫入程序b。

因此乙個程序需要與另外乙個程序通訊,需要某種系統機制才能完成。

binder是android系統程序間通訊(ipc)方式之一。linux已經擁有的程序間通訊ipc手段包括(internet process connection): 管道(pipe)、訊號(signal)和跟蹤(trace)、插口(socket)、報文佇列(message)、共享記憶體(share memory)和訊號量(semaphore)。

傳輸性好

socket:是乙個通用介面,導致其傳輸效率低,開銷大

共享記憶體:雖然在傳輸時不需要拷貝資料,但其控制機制複雜

binder:複雜資料型別傳遞可以復用記憶體,需要拷貝1次資料

管道和訊息佇列:採用儲存**方式,至少需要拷貝2次資料,效率低

安全性高

傳統的程序:傳統ipc沒有任何安全措施,完全依賴上層協議來確保。首先傳統ipc的接收方無法獲得對方程序可靠的uid和pid(使用者id程序id),從而無法鑑別對方身份。android為每個安裝好的應用程式分配了自己的uid,故程序的uid是鑑別程序身份的重要標誌。使用傳統ipc只能由使用者在資料報裡填入uid和pid,但這樣不可靠,容易被惡意程式利用。可靠的身份標記只有由ipc機制本身在核心中新增。其次傳統ipc訪問接入點是開放的,無法建立私有通道。比如命名管道的名稱,systemv的鍵值,socket的ip位址或檔名都是開放的,只要知道這些接入點的程式都可以和對端建立連線,不管怎樣都無法阻止惡意程式通過猜測接收方位址獲得連線。

binder機制:從協議本身就支援對通訊雙方做身份校檢,因而大大提公升了安全性

基於以上原因,android需要建立一套新的ipc機制來滿足系統對通訊方式,傳輸效能和安全性的要求,這就是binder。binder基於client-server通訊模式,傳輸過程只需一次拷貝,為傳送發新增uid/pid身份,既支援實名binder也支援匿名binder,安全性高。

binder框架定義了四個角色:server,client,servicemanager(sm)以及binder驅動。其中server,client,sm執行於使用者空間,驅動執行於核心空間。

所以client程序、server程序 & service manager 程序之間的互動都必須通過binder驅動(使用 open 和 ioctl檔案操作函式),而非直接互動。

首先需要註冊服務端,只有註冊了服務端,客戶端才有通訊的目標,服務端通過 servicemanager 註冊服務,註冊的過程就是向 binder 驅動的全域性鍊錶 binder_procs 中插入服務端的資訊(binder_proc 結構體,每個 binder_proc 結構體中都有 todo 任務佇列),然後向 servicemanager 的 svcinfo 列表中快取一下註冊的服務。

有了服務端,客戶端就可以跟服務端通訊了,通訊之前需要先獲取到服務,拿到服務的**,也可以理解為引用。

有了服務端的引用我們就可以向服務端傳送請求了,通過 binderproxy 將我們的請求引數傳送給 servicemanager,通過共享記憶體的方式使用核心方法 copy_from_user() 將我們的引數先拷貝到核心空間,這時我們的客戶端進入等待狀態,然後 binder 驅動向服務端的 todo 佇列裡面插入一條事務,執行完之後把執行結果通過 copy_to_user() 將核心的結果拷貝到使用者空間(這裡只是執行了拷貝命令,並沒有拷貝資料,binder只進行一次拷貝),喚醒等待的客戶端並把結果響應回來,這樣就完成了一次通訊。

.客戶端獲取服務端的**物件(proxy)。我們需要明確的是客戶端程序並不能直接操作服務端中的方法,如果要操作服務端中的方法,那麼有乙個可行的解決方法就是在客戶端建立乙個服務端程序的**物件,這個**物件具備和服務端程序一樣的功能,要訪問服務端程序中的某個方法,只需要訪問**物件中對應的方法即可

客戶端通過呼叫**物件向服務端傳送請求

**物件將使用者請求通過binder驅動傳送到伺服器程序

服務端程序處理客戶端發過來的請求,處理完之後通過binder驅動返回處理結果給客戶端的服務端**物件

**物件將請求結果進一步返回給客戶端程序

JAVA知識鞏固

執行緒池 1 執行緒是稀缺資源,使用執行緒池可以減少建立和銷毀執行緒的次數,每個工作執行緒都可以重複使用。2 可以根據系統的承受能力,調整執行緒池中工作執行緒的數量,防止因為消耗過多記憶體導致伺服器崩潰。執行緒池的實現原理 提交乙個任務到執行緒池中,執行緒池的處理流程如下 1 判斷執行緒池裡的核心執...

知識鞏固1

1.什麼是軟體測試 根據側重點的不同,主要有三種觀點 a.軟體測試就是為了發現錯誤而執行程式的過程 b.使用人工或工具測試某個系統的過程,其目的在於檢驗它是否滿足需求的規定或是弄清預期結果與實際結果之間的差別 c.軟體測試是一種重要的軟體質量保證活動 2.什麼是白盒測試?白盒測試又叫結構測試,邏輯驅...

jquery知識鞏固

1.jquery中的index方法和eq方法 index 方法 index 獲取的索引值是相對同兄弟元素,即同乙個父元素,所以首先要確認一下這個元素的兄弟是誰,例如 當遇到以上的情況很容易就覺得要在img元素上繫結事件,不行,因為img的兄弟元素其實只有他自己,所以要在li上面繫結,這樣子繫結的每一...