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