Android binderfs 檔案系統

Android binderfs 是一個用於 Android binder IPC 機制的檔案系統。它允許在執行時動態新增和刪除 binder 裝置。位於新 binderfs 例項中的 binder 裝置獨立於位於其他 binderfs 例項中的 binder 裝置。掛載新的 binderfs 例項可以獲得一組私有的 binder 裝置。

掛載 binderfs

可以使用以下命令掛載 Android binderfs

mkdir /dev/binderfs
mount -t binder binder /dev/binderfs

此時,一個新的 binderfs 例項將出現在 /dev/binderfs。在一個全新的 binderfs 例項中,不會存在任何 binder 裝置。只會有一個 binder-control 裝置,它作為 binderfs 的請求處理程式。在不同的位置掛載另一個 binderfs 例項將建立一個與所有其他 binderfs 掛載點新的、獨立的例項。這與 devptstmpfs 的行為相同。Android binderfs 檔案系統可以在使用者名稱空間中掛載。

選項

max

binderfs 例項可以掛載並限制可以分配的 binder 裝置的數量。max=<count> 掛載選項用作每個例項的限制。如果設定了 max=<count>,則只能在此 binderfs 例項中分配 <count> 個 binder 裝置。

stats

使用 stats=global 啟用全域性 binder 統計資訊。stats=global 僅適用於在初始使用者名稱空間中掛載的 binderfs 例項。嘗試使用該選項在另一個使用者名稱空間中掛載 binderfs 例項將返回許可權錯誤。

分配 Binder 裝置

要在 binderfs 例項中分配新的 binder 裝置,需要透過 binder-control 裝置節點發送請求。請求以 ioctl() 的形式傳送。

程式需要做的是開啟 binder-control 裝置節點,並向核心傳送 BINDER_CTL_ADD 請求。binderfs 的使用者需要告訴核心新 binder 裝置應該使用哪個名稱。預設情況下,名稱最多隻能包含 BINDERFS_MAX_NAME 個字元,包括終止零位元組。

一旦透過 ioctl() 傳遞一個帶有名稱的 struct binder_device 發出請求給核心,它將分配一個新的 binder 裝置,並在結構體中返回新裝置的主裝置號和次裝置號 (這是必要的,因為 binderfs 動態分配一個主裝置號)。在 ioctl() 返回後,將在 /dev/binderfs 下建立一個新的 binder 裝置,並使用所選的名稱。

刪除 Binder 裝置

可以透過 unlink() 刪除 Binderfs binder 裝置。這意味著可以使用 rm() 工具刪除它們。請注意,無法刪除 binder-control 裝置,因為這將使 binderfs 例項無法使用。當解除安裝 binderfs 例項並且所有對其的引用都已刪除時,將刪除 binder-control 裝置。

Binder 功能

假設 binderfs 的例項已掛載在 /dev/binderfs,則 binder 驅動程式支援的功能位於 /dev/binderfs/features/ 下。可以測試各個檔案的存在,以確定驅動程式是否支援特定功能。

示例

cat /dev/binderfs/features/oneway_spam_detection
1