总结
创建资源对象。
声明
#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 系统调用。资源通常会分发给公交车司机,很少需要司机使用司机协议直接与之交互。资源对象可以授予对从底数开始到但不包括底数 + 大小这一地址空间范围的访问权限。种类有两个特殊值:ZX_RSRC_KIND_ROOT
和 ZX_RSRC_KIND_SYSTEM
。根资源没有关联的范围。系统资源是一个范围资源,是许多资源的父级,所有这些资源的 size 均为 1,用作系统调用的特权检查。
parent_rsrc 必须是 kind ZX_RSRC_KIND_ROOT
资源的句柄,或者是与请求的 Kind 匹配且在范围中包含 [base, base+size] 的资源。
options 必须指定要创建的资源类型,并且可以包含可选标志。有效的资源种类包括 ZX_RSRC_KIND_MMIO
、ZX_RSRC_KIND_IRQ
、ZX_RSRC_KIND_IOPORT
(仅限 x86)、ZX_RSRC_KIND_ROOT
、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_FRAMEBUFFER_BASE
、ZX_RSRC_SYSTEM_PROFILE_BASE
和 ZX_RSRC_SYSTEM_MSI_BASE
。它们的 size 均为 1。
ZX_RSRC_KIND_ROOT
必须与 base 和 size 的零值成对,因为它不使用地址空间范围。
ZX_RSRC_FLAG_EXCLUSIVE
是可选标志。如果提供了 ZX_RSRC_FLAG_EXCLUSIVE
,系统调用将尝试专门预留所请求的地址空间区域,以防止其他资源创建与其重叠(只要存在)。
name 和 name_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_resource_create()
本身检查的 ZX_RIGHT_WRITE
。
权限
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_RSRC_KIND_ROOT
的资源。
ZX_ERR_INVALID_ARGS
options 包含无效的种类或标志组合,name 是无效的指针,或者指定的 Kind 为 ZX_RSRC_KIND_ROOT
,但 base 和 size 不为 0。
ZX_ERR_NO_MEMORY
因内存不足而失败。用户空间没有什么方法来处理此(不太可能)错误。在以后的 build 中,此错误不会再出现。