摘要
映射内核时钟对象的状态。
声明
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_WRITE
ZX_VM_PERM_EXECUTE
ZX_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()
的调用才能执行此操作。
权限
handle 必须为 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