总结
固定页面并授予设备访问权限。
声明
#include <zircon/syscalls.h>
zx_status_t zx_bti_pin(zx_handle_t handle,
uint32_t options,
zx_handle_t vmo,
uint64_t offset,
uint64_t size,
zx_paddr_t* addrs,
size_t num_addrs,
zx_handle_t* pmt);
说明
zx_bti_pin()
会固定 VMO 的页面(即使用 zx_vmo_op_range()
阻止这些页面停用),并授予由 BTI 代表的硬件事务 ID 访问这些页面的权限(使用选项中指定的权限)。
offset 必须与页面边界对齐。
options 是位字段,可能包含 ZX_BTI_PERM_READ
、ZX_BTI_PERM_WRITE
、ZX_BTI_PERM_EXECUTE
、ZX_BTI_COMPRESS
和 ZX_BTI_CONTIGUOUS
中的一项或多项。为使调用成功,vmo 必须具有与 options 中设置的权限标志相对应的读/写权限。(注意:ZX_BTI_PERM_EXECUTE
需要 ZX_RIGHT_READ
,而不是 ZX_RIGHT_EXECUTE
。)仅当 vmo 通过 zx_vmo_create_contiguous()
或 zx_vmo_create_physical()
分配时,才允许使用 ZX_BTI_CONTIGUOUS
。ZX_BTI_COMPRESS
和 ZX_BTI_CONTIGUOUS
是互斥的。
如果由 offset 和 size 指定的 vmo 范围包含未提交的页面,则成功调用此函数将使得这些页面已提交。如果失败,则无法确定它们是否已提交。
addrs 将填充所请求 VMO 页面的设备物理地址。这些地址可能会提供给使用与 BTI 关联的硬件事务 ID 发出内存事务的设备。返回的地址数量取决于指定的是 ZX_BTI_COMPRESS
还是 ZX_BTI_CONTIGUOUS
选项。地址数量将是以下三种可能之一:
- 如果二者都未设置,则每页一个 (
size / PAGE_SIZE
)。 - 如果设置了
ZX_BTI_COMPRESS
,值size / minimum-contiguity
就会向上舍入(每个地址表示一个字节次序(最小连续性),如果 size 不是最小连续性的倍数,则最后一个地址可能较短)。可以保证返回的所有地址都是最小连续性对齐的。请注意,可通过zx_object_get_info()
发现最小连续性。 - 如果设置了
ZX_BTI_CONTIGUOUS
,则为内存起始位置的单个地址。
num_addrs 是 addrs 数组中的条目数。如果 num_addrs 的值与上面计算出的值不匹配,则会出错。
PMT 会保留对关联 VMO 的引用,因此在 PMT 取消固定之前,底层 VMO 不会被销毁。
您可以固定可调整大小的 VMO。如果调用 zx_vmo_set_size()
会舍弃已固定的网页,则该调用将失败。
选项
ZX_BTI_PERM_READ
、ZX_BTI_PERM_WRITE
和ZX_BTI_PERM_EXECUTE
定义了硬件总线事务发起者将可以使用的访问类型。ZX_BTI_COMPRESS
会使返回的地址列表在每个最小连续性字节块中包含一个条目,而不是每个 PAGE_SIZE 字节。
权限
handle 必须为 ZX_OBJ_TYPE_BTI
类型,且具有 ZX_RIGHT_MAP
。
vmo 的类型必须为 ZX_OBJ_TYPE_VMO
,且必须为 ZX_RIGHT_MAP
。
如果 options 和 ZX_BTI_PERM_READ
,vmo 的类型必须为 ZX_OBJ_TYPE_VMO
,且具有 ZX_RIGHT_READ
。
如果 options 和 ZX_BTI_PERM_WRITE
,vmo 的类型必须为 ZX_OBJ_TYPE_VMO
,且具有 ZX_RIGHT_WRITE
。
如果 options 和 ZX_BTI_PERM_EXECUTE
,vmo 的类型必须为 ZX_OBJ_TYPE_VMO
,且具有 ZX_RIGHT_READ
。
返回值
如果操作成功,zx_bti_pin()
将返回 ZX_OK
。所请求 VMO 页面的设备物理地址将写入 addrs。通过 pmt 返回已创建的固定内存令牌的句柄。当不再需要 PMT 时,应调用 zx_pmt_unpin()
。
如果失败,则返回负数错误值。
错误
ZX_ERR_BAD_HANDLE
handle 或 vmo 不是有效的句柄。
ZX_ERR_WRONG_TYPE
句柄不是 BTI 句柄,或者 vmo 不是 VMO 句柄。
ZX_ERR_ACCESS_DENIED
标识名或 vmo 没有 ZX_RIGHT_MAP
,或者 options 包含与 vmo 没有的权限对应的权限标志。
ZX_ERR_INVALID_ARGS
options 为 0 或包含未定义的标志,addrs 或 pmt 不是有效的指针,num_addrs 与返回的条目数不同,或者 offset 或 size 不是页面对齐的。
ZX_ERR_OUT_OF_RANGE
offset + size
超出了视频观看的范围。
ZX_ERR_UNAVAILABLE
(临时):目前无法固定请求范围内的至少一个页面。
ZX_ERR_NO_MEMORY
:因内存不足而失败。用户空间没有好办法来处理这种(不太可能)错误。在以后的 build 中,此错误不会再发生。