zx_bti_pin

总结

固定页面并授予设备访问权限。

声明

#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_READZX_BTI_PERM_WRITEZX_BTI_PERM_EXECUTEZX_BTI_COMPRESSZX_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_CONTIGUOUSZX_BTI_COMPRESSZX_BTI_CONTIGUOUS 是互斥的。

如果由 offsetsize 指定的 vmo 范围包含未提交的页面,则成功调用此函数将使得这些页面已提交。如果失败,则无法确定它们是否已提交。

addrs 将填充所请求 VMO 页面的设备物理地址。这些地址可能会提供给使用与 BTI 关联的硬件事务 ID 发出内存事务的设备。返回的地址数量取决于指定的是 ZX_BTI_COMPRESS 还是 ZX_BTI_CONTIGUOUS 选项。地址数量将是以下三种可能之一:

  1. 如果二者都未设置,则每页一个 (size / PAGE_SIZE)。
  2. 如果设置了 ZX_BTI_COMPRESS,值 size / minimum-contiguity 就会向上舍入(每个地址表示一个字节次序(最小连续性),如果 size 不是最小连续性的倍数,则最后一个地址可能较短)。可以保证返回的所有地址都是最小连续性对齐的。请注意,可通过 zx_object_get_info() 发现最小连续性
  3. 如果设置了 ZX_BTI_CONTIGUOUS,则为内存起始位置的单个地址。

num_addrsaddrs 数组中的条目数。如果 num_addrs 的值与上面计算出的值不匹配,则会出错。

PMT 会保留对关联 VMO 的引用,因此在 PMT 取消固定之前,底层 VMO 不会被销毁。

您可以固定可调整大小的 VMO。如果调用 zx_vmo_set_size() 会舍弃已固定的网页,则该调用将失败。

选项

  • ZX_BTI_PERM_READZX_BTI_PERM_WRITEZX_BTI_PERM_EXECUTE 定义了硬件总线事务发起者将可以使用的访问类型。
  • ZX_BTI_COMPRESS 会使返回的地址列表在每个最小连续性字节块中包含一个条目,而不是每个 PAGE_SIZE 字节

权限

handle 必须为 ZX_OBJ_TYPE_BTI 类型,且具有 ZX_RIGHT_MAP

vmo 的类型必须为 ZX_OBJ_TYPE_VMO,且必须为 ZX_RIGHT_MAP

如果 optionsZX_BTI_PERM_READvmo 的类型必须为 ZX_OBJ_TYPE_VMO,且具有 ZX_RIGHT_READ

如果 optionsZX_BTI_PERM_WRITEvmo 的类型必须为 ZX_OBJ_TYPE_VMO,且具有 ZX_RIGHT_WRITE

如果 optionsZX_BTI_PERM_EXECUTEvmo 的类型必须为 ZX_OBJ_TYPE_VMO,且具有 ZX_RIGHT_READ

返回值

如果操作成功,zx_bti_pin() 将返回 ZX_OK。所请求 VMO 页面的设备物理地址将写入 addrs。通过 pmt 返回已创建的固定内存令牌的句柄。当不再需要 PMT 时,应调用 zx_pmt_unpin()

如果失败,则返回负数错误值。

错误

ZX_ERR_BAD_HANDLE handlevmo 不是有效的句柄。

ZX_ERR_WRONG_TYPE 句柄不是 BTI 句柄,或者 vmo 不是 VMO 句柄。

ZX_ERR_ACCESS_DENIED 标识名vmo 没有 ZX_RIGHT_MAP,或者 options 包含与 vmo 没有的权限对应的权限标志。

ZX_ERR_INVALID_ARGS options 为 0 或包含未定义的标志,addrspmt 不是有效的指针,num_addrs 与返回的条目数不同,或者 offsetsize 不是页面对齐的。

ZX_ERR_OUT_OF_RANGE offset + size超出了视频观看的范围。

ZX_ERR_UNAVAILABLE(临时):目前无法固定请求范围内的至少一个页面。

ZX_ERR_NO_MEMORY:因内存不足而失败。用户空间没有好办法来处理这种(不太可能)错误。在以后的 build 中,此错误不会再发生。

另请参阅