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 结束(不 包括 base + size)。kind 存在一个特殊值:ZX_RSRC_KIND_SYSTEM。系统资源是一种范围资源,是多个资源的父级,所有资源的大小均为 1,用作系统调用的特权检查。

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

options 必须指定要创建的资源类型,并且可以包含可选标志。有效的资源类型包括 ZX_RSRC_KIND_MMIO、ZX_RSRC_KIND_IRQ、ZX_RSRC_KIND_IOPORT(仅限 x86)、ZX_RSRC_KIND_SMC(仅限 ARM)和 ZX_RSRC_KIND_SYSTEM。ZX_RSRC_KIND_SYSTEM 的有效基数为 ZX_RSRC_SYSTEM_HYPERVISOR_BASE、ZX_RSRC_SYSTEM_VMEX_BASE、ZX_RSRC_SYSTEM_DEBUG_BASE、ZX_RSRC_SYSTEM_INFO_BASE、ZX_RSRC_SYSTEM_CPU_BASE、ZX_RSRC_SYSTEM_POWER_BASE、ZX_RSRC_SYSTEM_ENERGY_INFO_BASE、ZX_RSRC_SYSTEM_IOMMU_BASE、ZX_RSRC_SYSTEM_PROFILE_BASE、/ ZX_RSRC_SYSTEM_MSI_BASE、ZX_RSRC_SYSTEM_DEBUGLOG_BASE 和 ZX_RSRC_SYSTEM_STALL_BASE。这些张量的大小均为 1。

ZX_RSRC_FLAG_EXCLUSIVE 标志是可选的。如果提供了 ZX_RSRC_FLAG_EXCLUSIVE,则系统调用将尝试独占保留请求的地址空间区域,从而防止其他资源创建与该区域重叠(只要该区域存在)。

name 和 name_size 是可选的,会被截断为 ZX_MAX_NAME_LENGTH - 1。此名称仅供调试 / 工具使用,内核不会使用。

如果成功,则会在 resource_out 中返回有效的资源句柄。

默认情况下,系统会在句柄上设置以下权限:

  • ZX_RIGHT_DUPLICATE - 标识名可能重复。

  • ZX_RIGHT_TRANSFER - 句柄可能会转移到其他进程。

  • ZX_RIGHT_WRITE - 由 zx_resource_create() 自行检查。

  • ZX_RIGHT_INSPECT - 可以使用 zx_object_get_info() 检查对象。

  • ZX_RIGHT_GET_PROPERTY - 可使用 zx_object_get_property() 获取其属性。

  • ZX_RIGHT_SET_PROPERTY - 可以使用 zx_object_set_property() 设置其属性。

返回值

zx_resource_create() 成功时会返回 ZX_OK。如果失败,则返回负错误值。

权限

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 句柄不是 kind 类型的资源。

ZX_ERR_INVALID_ARGS options 包含无效的种类或标志组合,或者 name 是无效指针。

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

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

另请参阅