摘要
映射内核时钟对象的状态。
声明
zx_status_t zx_vmar_map_clock(zx_handle_t handle,
zx_vm_option_t options,
uint64_t vmar_offset,
zx_handle_t clock_handle,
uint64_t len,
user_out_ptr<zx_vaddr_t> mapped_addr);
说明
将给定时钟的状态映射到给定的虚拟内存地址区域。映射保留对底层虚拟内存对象的引用,这意味着关闭时钟句柄不会移除此函数添加的映射。指定的 options 与对 zx_vmar_map() 的调用中使用的相同,但以下选项明确禁止使用,并且始终会导致错误:
ZX_VM_PERM_WRITEZX_VM_PERM_EXECUTEZX_VM_PERM_READ_IF_XOM_UNSUPPORTED
此外,未提供 vmo_offet,且传递的长度必须是使用针对具有 ZX_INFO_CLOCK_MAPPED_SIZE 主题的时钟对象执行的 zx_object_get_info() 调用报告的长度。不允许部分映射时钟状态。
无论用户传递的选项如何,使用此系统调用创建的映射始终无法调整大小。
除了拥有足够的 VMAR 权限来创建映射之外,clock_handle 还必须拥有 ZX_RIGHT_READ 和 ZX_RIGHT_MAP 权限。
与 VMO 类似,通过将原始映射的地址和长度传递给 zx_vmar_unmap() 的调用,即可取消映射时钟。
用户可以在映射时钟句柄后关闭该句柄,但仍可读取时钟的状态。
关闭时钟句柄不会销毁映射,只有对 zx_vmar_unmap() 的正确构造的调用才能销毁映射。
权限
句柄必须是 ZX_OBJ_TYPE_VMAR 类型。
clock_handle 必须是 ZX_OBJ_TYPE_CLOCK 类型。
返回值
如果成功,zx_vmar_map_clock() 会返回 ZX_OK 和映射的绝对基地址(通过 mapped_addr)。基地址将与页面对齐且不为零。如果失败,则返回负错误值。
错误
ZX_ERR_BAD_HANDLE handle 或 clock_handle 不是有效的句柄。
ZX_ERR_WRONG_TYPE handle 或 clock_handle 不是 VMAR 或时钟句柄。
ZX_ERR_BAD_STATE handle 指的是已销毁的 VMAR。
ZX_ERR_INVALID_ARGS,用于以下任一用途:
len与ZX_INFO_CLOCK_MAPPED_SIZE报告的映射大小不一致。options包含上述明确禁止的标志之一。
另请参阅 zx_vmar_map() 可能返回的错误,了解这两个系统调用可能共有的其他错误。
备注
使用 ZX_INFO_VMAR_MAPS 或 ZX_INFO_PROCESS_MAPS 主题通过 zx_object_get_info() 系统调用枚举的映射将包含与映射的 VMO 相同的信息,但有以下例外情况:
- 字符串“kernel-clock”将作为映射的名称返回
- 报告为时钟对象的 KOID 的映射的 KOID。
另请参阅
- mappable_clocks
zx_vmar_map()zx_vmar_unmap()zx_object_get_info()ZX_INFO_CLOCK_MAPPED_SIZE:object_get_info.md#zx_info_clock_mapped_sizeZX_INFO_VMAR_MAPS:object_get_info.md#zx_info_vmar_mapsZX_INFO_PROCESS_MAPS:object_get_info.md#zx_info_process_maps