zx_object_get_property

摘要

詢問各種核心物件的各種屬性。

宣告

#include <zircon/syscalls.h>

zx_status_t zx_object_get_property(zx_handle_t handle,
                                   uint32_t property,
                                   void* value,
                                   size_t value_size);

說明

zx_object_get_property() 會要求核心物件的屬性值。必須具備帳號代碼的 ZX_RIGHT_GET_PROPERTY 權限才能取得資源。

handle 參數代表目標核心物件。不同屬性僅適用於特定類型的核心物件,如下所述。

property 參數會指明要取得/設定的屬性。屬性值具有 ZX_PROP_ 前置字串,說明如下。

value 參數會保留屬性值,且必須是指向 value_size 位元組緩衝區的指標。不同的屬性預期會有不同的值類型/大小,如下所述。

屬性

屬性值有前置字元 ZX_PROP_,定義於

#include <zircon/syscalls/object.h>

ZX_PROP_NAME

handle 類型:Any of the following - 工作 - 程序 - 執行緒 - 資源 - 虛擬記憶體物件 (VMO) - 匯流交易發起者 (BTI)

value 類型:char[ZX_MAX_NAME_LEN]

允許的作業:getset

物件名稱,以 NUL 結尾字串的形式。

嘗試取得或設定已結束的執行緒名稱將會失敗,並顯示 ZX_ERR_BAD_STATE

ZX_PROP_REGISTER_FS 和 ZX_PROP_REGISTER_GS

handle 類型:Thread

value 類型:uintptr_t

允許的作業:getset

x86 FS.BASE 或 GS.BASE 註冊的值會分別指定。value 必須是標準位址。如果嘗試設定非標準位址,將會失敗並顯示 ZX_ERR_INVALID_ARGS

這會以軟體替代 rdfsbasewrfsbaserdgsbase,以及較新 x86 至 64 CPU 支援的 wrgsbase 指令配對,而且行為應與直接使用 CPU 操作說明相同 (除非您嘗試設定非標準位址,而只會傳回錯誤,而不是產生機器例外狀況)。使用支援這些指令的 CPU 時 (如 cpuid 指令所回報),直接使用機器操作說明會比較有效率。

僅適用於 x86-64。在其他架構上傳回 ZX_ERR_NOT_SUPPORTED。如果未從目前的執行緒叫用,系統會傳回 ZX_ERR_ACCESS_DENIED

ZX_PROP_PROCESS_DEBUG_ADDR

handle 類型:Process

value 類型:uintptr_t

允許的作業:getset

ld.so 的 _dl_debug_addr 值。偵錯工具可將其用於輪詢動態載入器的狀態。

ZX_PROP_PROCESS_BREAK_ON_LOAD

handle 類型:Process

value 類型:uintptr_t

允許的作業:getset

判斷動態載入器是否會在共用程式庫的每次載入時發出偵錯追蹤。如果設定在程序的第一個執行緒執行前設定,也會為初始載入觸發偵錯追蹤。

動態載入器會先設定 ZX_PROP_PROCESS_DEBUG_ADDR 的預期值,再觸發這個偵錯追蹤。例外狀況處理常式可以使用這個屬性查詢動態載入器的狀態。

動態載入器發生問題時,系統也會將 ZX_PROP_PROCESS_BREAK_ON_LOAD 的值設為偵錯追蹤的位址,這樣一來,偵錯工具便可將該值與例外狀況位址進行比較,以判斷動態載入器是否觸發了偵錯追蹤。

系統會將任何非零的值視為可啟用這項功能。將此屬性設為 0 將停用。偵錯工具也能使用這項屬性,偵測是否已有其他附加至同一程序的偵錯工具。

ZX_PROP_PROCESS_VDSO_BASE_ADDRESS

handle 類型:Process

value 類型:uintptr_t

允許的作業:get

vDSO 對應基準地址,或是零。

ZX_PROP_PROCESS_HW_TRACE_CONTEXT_ID

handle 類型:Process

value 類型:uintptr_t

允許的作業:get

結構定義 ID 可在硬體指示追蹤中區分不同的程序。在 Intel X86-64 上,這是註冊 CR3 的值。

如要取得 ZX_PROP_PROCESS_HW_TRACE_CONTEXT_ID,您必須在核心指令列中指定 kernel.enable-debugging-syscalls=true。否則,函式會傳回 ZX_ERR_NOT_SUPPORTED

目前僅針對 X86 定義。

ZX_PROP_SOCKET_RX_THRESHOLD

handle 類型:Socket

value 類型:size_t

允許的作業:getset

通訊端讀取門檻的大小 (以位元組為單位)。這樣一來,如果可讀取的資料量大於或等於門檻,系統就會宣告 ZX_SOCKET_READ_THRESHOLD。如果將這項屬性設為零,會導致 ZX_SOCKET_READ_THRESHOLD 降低。

設定值如果大於通訊端支援的大小上限,則執行 ZX_ERR_INVALID_ARGS 時會失敗。

ZX_PROP_SOCKET_TX_THRESHOLD

handle 類型:Socket

value 類型:size_t

允許的作業:getset

通訊端的寫入門檻大小 (以位元組為單位)。如果啟用這項設定,當寫入的可用空間數量大於或等於門檻時,就會宣告 ZX_SOCKET_WRITE_THRESHOLD。如果將這項屬性設為零,會導致 ZX_SOCKET_WRITE_THRESHOLD 降低。在對等點關閉後才設定寫入門檻是錯誤,且會導致傳回 ZX_ERR_PEER_CLOSED 錯誤。

設定值如果大於通訊端支援的大小上限,則執行 ZX_ERR_INVALID_ARGS 時會失敗。

ZX_PROP_JOB_KILL_ON_OOM

handle 類型:Job

value 類型:size_t

允許的作業:set

1 這個值表示如果系統發現整個系統的記憶體不足,就會終止 Job 及其子項。呼叫 0 (預設值) 表示停止工作在此情境中終止。無法在 ZX_ERR_INVALID_ARGS 中設定任何其他值。

ZX_PROP_EXCEPTION_STATE

handle 類型:Exception

value 類型:uint32_t

允許的作業:getset

設為 ZX_EXCEPTION_STATE_HANDLED 時,關閉例外狀況控點將會完成例外狀況處理,並繼續執行基礎執行緒。設為 ZX_EXCEPTION_STATE_TRY_NEXT 時,關閉例外狀況控點後,系統會依序嘗試下一個處理常式,以繼續處理例外狀況。設為 ZX_EXCEPTION_STATE_THREAD_EXIT 時,關閉例外狀況控制代碼會導致產生例外狀況的執行緒結束。無法在 ZX_ERR_INVALID_ARGS 中設定任何其他值。

ZX_PROP_EXCEPTION_STRATEGY

handle 類型:Exception

value 類型:uint32_t

允許的作業:getset

如果設定 ZX_EXCEPTION_STRATEGY_SECOND_CHANCE,當程序層級處理常式失敗時,偵錯工具就會獲得「第二次」處理例外狀況的機會。如果設定了 ZX_EXCEPTION_STRATEGY_FIRST_CHANCE,偵錯工具就無法連續處理例外狀況。無法在 ZX_ERR_INVALID_ARGS 中設定任何其他值。

只有在控制代碼對應至偵錯工具程序例外狀況管道時,才能設定這個屬性。如果例外狀況管道為任何其他類型,嘗試設定這個屬性,會導致 ZX_ERR_BAD_STATE

ZX_PROP_STREAM_MODE_APPEND

handle 類型:Stream

value 類型:uint8_t

允許的作業:getset

如果串流處於附加模式,這個屬性則值為 1,且串流未處於附加模式時的值則為 0。在 zx_stream_writev() 中寫入資料之前,在附加模式下的串流會以不可分割的形式,將串流的搜尋偏移量設為串流的內容大小。

權限

handle 必須包含 ZX_RIGHT_GET_PROPERTY,且必須是屬性支援的 ZX_OBJ_TYPE_,詳情請參閱上述個別屬性的說明。

傳回值

zx_object_get_property() 會在成功時傳回 ZX_OK。如果失敗,系統會傳回負值的錯誤值。

錯誤

個別屬性值的具體錯誤已列於上述說明中。 以下列出常見的錯誤:

ZX_ERR_BAD_HANDLE帳號代碼不是有效的控制代碼。

ZX_ERR_WRONG_TYPEhandle 不是屬性的適當類型。

ZX_ERR_ACCESS_DENIED帳號代碼沒有這項作業的必要權限。

ZX_ERR_INVALID_ARGSvalue 是無效指標。

ZX_ERR_NO_MEMORY 因記憶體不足而失敗。使用者空間無法以任何方式處理這個錯誤 (極可能) 錯誤。日後的建構作業不會再發生這個錯誤。

ZX_ERR_BUFFER_TOO_SMALL屬性value_size 太小。

ZX_ERR_NOT_SUPPORTEDproperty 不存在。

另請參閱