总结
将页面提供到分页器拥有的 VMO 中。
声明
#include <zircon/syscalls.h>
zx_status_t zx_pager_supply_pages(zx_handle_t pager,
zx_handle_t pager_vmo,
uint64_t offset,
uint64_t length,
zx_handle_t aux_vmo,
uint64_t aux_offset);
说明
将 [aux_offset, aux_offset + length) 范围内的 aux_vmo 页面移至 [offset, offset + length) 范围内的 pager_vmo。系统不会替换指定范围内的 pager_vmo 中的所有页面,而会释放 aux_vmo 中的相应页面。aux_vmo 不能是物理、连续或由分页器提供支持的页面,并且不得在指定范围内固定页面。aux_vmo 中任何未提交的页面都会导致在 pager_vmo 中插入零个页面或同等页面。执行此操作后,指定 aux_vmo 区域将完全停用。
权限
pager 必须为 ZX_OBJ_TYPE_PAGER
类型且具有 ZX_RIGHT_MANAGE_VMO
。
pager_vmo 的类型必须为 ZX_OBJ_TYPE_VMO
且设为 ZX_RIGHT_WRITE
。
aux_vmo 的类型必须为 ZX_OBJ_TYPE_VMO
,且必须设为 ZX_RIGHT_READ
和 ZX_RIGHT_WRITE
。
返回值
zx_pager_supply_pages()
在成功时返回 ZX_OK,或在失败时返回以下错误代码之一。
如果失败,指定的 aux_vmo 范围可能不受影响,也可能完全停用。如果停用 aux_vmo,系统将填充 pager_vmo 中未指定数量的页面。
错误
ZX_ERR_BAD_HANDLE
pager、pager_vmo 或 aux_vmo 不是有效的句柄。
ZX_ERR_WRONG_TYPE
pager 不是分页器句柄、pager_vmo 不是 VMO 句柄,或者 aux_vmo 不是 VMO 句柄。
ZX_ERR_INVALID_ARGS
pager_vmo 不是通过 pager 创建的 VMO,或者 offset、size 或 aux_offset 未对齐页面。
ZX_ERR_ACCESS_DENIED
pager 没有 ZX_RIGHT_MANAGE_VMO
,或者 aux_vmo 没有 ZX_RIGHT_READ
或 ZX_RIGHT_WRITE
,或者 pager_vmo 没有 ZX_RIGHT_WRITE
。
ZX_ERR_BAD_STATE
aux_vmo 未处于可提供所需页面的状态,或 pager_vmo 已与 pager 分离。
ZX_ERR_NOT_SUPPORTED
aux_vmo 是一个物理、连续或由分页器支持的 VMO。
ZX_ERR_OUT_OF_RANGE
pager_vmo 或 aux_vmo 中指定的范围无效。
ZX_ERR_NO_MEMORY
:因内存不足而失败。