摘要
建立資源物件。
宣告
#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
。根資源沒有任何相關聯的範圍。系統資源是一個範圍範圍資源,即多個資源的父項 (全部為 size 1),用來做為系統呼叫的特殊檢查。
parent_rsrc 必須是「種類」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 是無效指標,或者指定的 Kind 為 ZX_RSRC_KIND_ROOT
,但是 base 和 size 不是 0。
ZX_ERR_NO_MEMORY
因記憶體不足而失敗。使用者空間無法妥善處理這項 (不太可能) 錯誤。日後的建構作業不會再發生這個錯誤。