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 挂载分开的实例。这与例如 devpts
和 tmpfs
的行为相同。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