摘要
建立資源物件。
宣告
#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,用於 syscall 的權限檢查。
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 記憶體不足,因此失敗。使用者空間無法妥善處理這項 (不太可能發生的) 錯誤。日後建構時,就不會再發生這項錯誤。