摘要
创建资源对象。
声明
#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_ROOT
和ZX_RSRC_KIND_SYSTEM
。根资源没有范围
及其关联。该系统资源是一个范围资源,它是父级资源
数量全部为 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
。它们的尺寸均为 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_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 句柄不是以下任一项的资源:
kind 或 ZX_RSRC_KIND_ROOT
。
ZX_ERR_INVALID_ARGS
options 包含无效的种类或标志组合,
name 是无效的指针,或者指定的种类为 ZX_RSRC_KIND_ROOT
但“base”和“size”不是 0。
ZX_ERR_NO_MEMORY
因内存不足而失败。没有什么好办法
处理此(不太可能)错误。在未来的版本中,此错误将不再出现
出现时间更长。