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 + size 的地址空间范围的访问权限。kind 有两个特殊值:ZX_RSRC_KIND_ROOTZX_RSRC_KIND_SYSTEM。根资源没有关联的范围。系统资源是一种范围资源,是多个资源的父级,所有这些资源的大小均为 1,用于对系统调用进行特权检查。

parent_rsrc 必须是类型ZX_RSRC_KIND_ROOT 的资源的句柄,或者与请求的类型匹配且范围包含 [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_BASEZX_RSRC_SYSTEM_ENERGY_INFO_BASEZX_RSRC_SYSTEM_IOMMU_BASEZX_RSRC_SYSTEM_PROFILE_BASE、/ ZX_RSRC_SYSTEM_MSI_BASEZX_RSRC_SYSTEM_DEBUGLOG_BASEZX_RSRC_SYSTEM_STALL_BASE。这些都具有 size 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 是无效的指针,或者指定的kindZX_RSRC_KIND_ROOT,但 basesize 不为 0。

ZX_ERR_NOT_FOUND 未找到合适的资源分配。如果地址范围无效、范围已归独占资源所有,或者存在常规资源且调用方尝试在同一范围内创建独占资源,就会发生这种情况。

ZX_ERR_NO_MEMORY 因内存不足而失败。用户空间没有很好的方法来处理这种(不太可能发生的)错误。在未来的 build 中,此错误将不再出现。

另请参阅