zx_resource_create

摘要

创建资源对象。

声明

#include <zircon/syscalls.h>

zx_status_t zx_resource_create(zx_handle_t parent_rsrc,
                               uint32_t options,
                               uint64_t base,
                               size_t size,
                               const char* name,
                               size_t name_size,
                               zx_handle_t* resource_out);

说明

zx_resource_create() 可创建用于其他 DDK 的资源对象 系统调用。资源通常会分发给公交车司机,很少需要 由驾驶员使用驱动程序协议直接进行交互。资源对象 授予对从 base 开始的地址空间范围(最高但不包括)的访问权限 包括 base + sizekind 有两个特殊值: ZX_RSRC_KIND_ROOTZX_RSRC_KIND_SYSTEM。根资源没有范围 及其关联。该系统资源是一个范围资源,它是父级资源 数量全部为 1 的资源(用于进行特权检查) 用于系统调用

parent_rsrc 必须是 kind ZX_RSRC_KIND_ROOT 资源的句柄,或者 与所请求的 kind 匹配且包含 [base, base+size] 的资源 。

options 必须指定要创建的资源类型,并且可能包含可选的 标志。有效的资源类型包括 ZX_RSRC_KIND_MMIOZX_RSRC_KIND_IRQZX_RSRC_KIND_IOPORT(仅限 x86)、ZX_RSRC_KIND_ROOTZX_RSRC_KIND_SMC (仅限 ARM)和 ZX_RSRC_KIND_SYSTEMZX_RSRC_KIND_SYSTEM 的有效基数为 ZX_RSRC_SYSTEM_HYPERVISOR_BASEZX_RSRC_SYSTEM_VMEX_BASEZX_RSRC_SYSTEM_DEBUG_BASEZX_RSRC_SYSTEM_INFO_BASEZX_RSRC_SYSTEM_CPU_BASEZX_RSRC_SYSTEM_POWER_BASEZX_RSRC_SYSTEM_MEXEC_BASE ZX_RSRC_SYSTEM_ENERGY_INFO_BASEZX_RSRC_SYSTEM_IOMMU_BASEZX_RSRC_SYSTEM_FRAMEBUFFER_BASEZX_RSRC_SYSTEM_PROFILE_BASEZX_RSRC_SYSTEM_MSI_BASE。它们的尺寸均为 1。 ZX_RSRC_KIND_ROOT 必须与 basesize 的零值配对,因为 它不使用地址空间范围

ZX_RSRC_FLAG_EXCLUSIVE 是可选标志。如果ZX_RSRC_FLAG_EXCLUSIVE 系统调用将尝试专门预留 地址空间区域,以防止创建其他资源与 只要存在即可。

namename_size 是可选的,截断为 ZX_MAX_NAME_LENGTH - 1。 此名称仅供调试 / 工具使用,不用于 内核版本。

成功后,resource_out 中会返回有效的资源句柄。

返回值

如果成功,zx_resource_create() 会返回 ZX_OK。如果失败, 返回负数。

返回的句柄将具有 ZX_RIGHT_TRANSFER(以便于将其发送到 通过 zx_channel_write() 发送另一个进程)、ZX_RIGHT_DUPLICATE(允许 要复制的句柄)、ZX_RIGHT_INSPECT(以便检查 具有 zx_object_get_info()ZX_RIGHT_WRITE 对象,该对象会由 zx_resource_create() 本身。

权限

parent_rsrc 的类型必须为 ZX_OBJ_TYPE_RESOURCE 且包含 ZX_RIGHT_WRITE

错误

ZX_ERR_BAD_HANDLE parent_rsrc 句柄无效。

ZX_ERR_WRONG_TYPE 表示 parent_rsrc 句柄不是资源句柄。

ZX_ERR_ACCESS_DENIED parent_rsrc 句柄不是以下任一项的资源: kindZX_RSRC_KIND_ROOT

ZX_ERR_INVALID_ARGS options 包含无效的种类或标志组合, name 是无效的指针,或者指定的种类为 ZX_RSRC_KIND_ROOT 但“base”和“size”不是 0。

ZX_ERR_NO_MEMORY 因内存不足而失败。没有什么好办法 处理此(不太可能)错误。在未来的版本中,此错误将不再出现 出现时间更长。

另请参阅