摘要
建立資源物件。
宣告
#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 (不含 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_PROFILE_BASE、/ ZX_RSRC_SYSTEM_MSI_BASE、ZX_RSRC_SYSTEM_DEBUGLOG_BASE 和 ZX_RSRC_SYSTEM_STALL_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_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_NOT_FOUND 找不到適當的資源分配。發生這種情況的原因可能是地址範圍無效、範圍已由專屬資源擁有,或是已存在一般資源,而呼叫端嘗試在相同範圍內建立專屬資源。
ZX_ERR_NO_MEMORY 記憶體不足導致失敗。使用者空間沒有適當的方式來處理這個 (不太可能發生的) 錯誤。日後的版本將不會再發生這個錯誤。