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 设备

Binderfs binder 设备可以通过 unlink() 删除。这意味着可以使用 rm() 工具来删除它们。请注意,binder-control 设备不能被删除,因为这会使 binderfs 实例无法使用。binder-control 设备将在 binderfs 实例被卸载且对其的所有引用被释放时被删除。

Binder 功能

假设一个 binderfs 实例已挂载到 /dev/binderfs,binder 驱动程序支持的功能位于 /dev/binderfs/features/ 下。可以通过测试各个文件的存在与否来确定驱动程序是否支持特定功能。

示例

cat /dev/binderfs/features/oneway_spam_detection
1