摘要
创建资源对象。
声明
#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_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_MEXEC_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 包含无效的 kind 或标志组合,或者 name 是无效的指针。
ZX_ERR_NOT_FOUND 未找到合适的资源分配。如果地址范围无效、范围已被独占资源占用,或者存在常规资源且调用方尝试在同一范围内创建独占资源,则会发生这种情况。
ZX_ERR_NO_MEMORY 因内存不足而导致的失败。用户空间无法妥善处理此(不太可能发生的)错误。在未来的 build 中,此错误将不再发生。