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 文件系统可以在用户命名空间中挂载。

选项

最大值

可以挂载 binderfs 实例,并限制可以分配的 binder 设备数量。max=<count> 挂载选项用作每个实例的限制。如果设置了 max=<count>,则此 binderfs 实例中只能分配 <count> 个 binder 设备。

统计信息

使用 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