摘要
設定工作安全性和資源政策。
宣告
#include <zircon/syscalls.h>
zx_status_t zx_job_set_policy(zx_handle_t handle,
uint32_t options,
uint32_t topic,
const void* policy,
uint32_t policy_size);
說明
將一或多項安全性和/或資源政策設為空白工作。工作的有效政策結合了父項的有效政策與政策中指定的政策。如果現有政策與新政策相衝突,效果會由 options 值控制:
ZX_JOB_POL_RELATIVE
:政策適用於未由父項政策明確覆寫的條件。ZX_JOB_POL_ABSOLUTE
:政策會套用到政策中的所有條件,或者系統呼叫失敗。
在這個呼叫成功之後,任何新的子項程序或子工作將套用新的有效政策。
topic 表示 policy 格式。支援的值為 ZX_JOB_POL_BASIC_V1
、ZX_JOB_POL_BASIC_V2
和 ZX_JOB_POL_TIMER_SLACK
。
ZX_JOB_POL_BASIC_V2 and V1
ZX_JOB_POL_BASIC_V2
的 主題 表示 policy 是下列項目的陣列:
typedef struct zx_policy_basic {
uint32_t condition;
uint32_t action;
uint32_t flags;
} zx_policy_basic_v2_t;
ZX_JOB_POL_BASIC_V1
的 主題 表示 policy 是下列項目的陣列:
// Deprecated. Use zx_policy_basic_v2_t.
typedef struct zx_policy_basic {
uint32_t condition;
uint32_t policy;
} zx_policy_basic_v1_t;
其中 condition 為
ZX_POL_BAD_HANDLE
在此工作中的程序正嘗試發出具有無效的控制代碼的系統呼叫。在此情況下,ZX_POL_ACTION_ALLOW
和ZX_POL_ACTION_DENY
相等:如果 syscall 傳回,一律會傳回錯誤ZX_ERR_BAD_HANDLE
。ZX_POL_WRONG_OBJECT
在此工作中的程序嘗試發出系統呼叫,而該處理常式不支援此類作業。ZX_POL_VMAR_WX
:這項工作底下的程序嘗試對應具有寫入執行權限的位址區域。ZX_POL_NEW_VMO
:這項工作底下的程序會嘗試建立新的 VM 物件。ZX_POL_NEW_CHANNEL
在此工作中的程序正嘗試建立新管道。ZX_POL_NEW_EVENT
執行這項工作的程序正嘗試建立新事件。ZX_POL_NEW_EVENTPAIR
執行這項工作的程序正嘗試建立新的事件組合。ZX_POL_NEW_PORT
執行這項工作的程序正嘗試建立新的通訊埠。ZX_POL_NEW_SOCKET
這項工作下的程序正嘗試建立新的通訊端。ZX_POL_NEW_FIFO
執行這項工作的程序正嘗試建立新的 Fifo。ZX_POL_NEW_TIMER
這項工作中的程序正嘗試建立新的計時器。ZX_POL_NEW_PROCESS
:這項工作中的程序正嘗試建立新的程序。ZX_POL_NEW_PROFILE
:這項工作中的程序正嘗試建立新的設定檔。ZX_POL_NEW_PAGER
:這項工作底下的程序正嘗試建立新的 VMO 呼叫器。- 在此工作中的程序
ZX_POL_AMBIENT_MARK_VMO_EXEC
會嘗試使用zx_vmo_replace_as_executable()
搭配ZX_HANDLE_INVALID
做為第二個引數,而非以ZX_RSRC_SYSTEM_VMEX_BASE
為底的有效ZX_RSRC_KIND_SYSTEM
資源。 ZX_POL_NEW_ANY
是一個特殊條件,代表上述所有ZX_NEW
條件,例如ZX_POL_NEW_VMO
、ZX_POL_NEW_CHANNEL
、ZX_POL_NEW_EVENT
、ZX_POL_NEW_EVENTPAIR
、ZX_POL_NEW_PORT
、ZX_POL_NEW_SOCKET
、ZX_POL_NEW_FIFO
,以及日後的任何ZX_NEW
政策。這將包括任何不需要父項物件建立的新核心物件。ZX_POL_NEW_IOB
執行這項工作的程序正嘗試建立新的 IOBuffer。
其中 ZX_JOB_POL_BASIC_V1
的 policy 或 ZX_JOB_POL_BASIC_V2
的 action 是以下任一個值:
ZX_POL_ACTION_ALLOW
允許條件。ZX_POL_ACTION_DENY
預防了限制條件。ZX_POL_ACTION_ALLOW_EXCEPTION
會透過偵錯通訊埠產生例外狀況。以這種方式產生的例外狀況可做為中斷點。可在例外狀況後恢復執行緒。重新啟用後,系統會允許觸發例外狀況的條件完成,就像沒有違反政策的情況一樣。ZX_POL_ACTION_DENY_EXCEPTION
與ZX_POL_ACTION_ALLOW_EXCEPTION
一樣,但繼續後,條件會遭到拒絕,通常會產生ZX_ERR_ACCESS_DENIED
。ZX_POL_ACTION_KILL
終止程序。
其中 flags 為
ZX_POL_OVERRIDE_ALLOW
允許變更子工作上的這項政策。ZX_POL_OVERRIDE_DENY
不允許針對子工作變更這項政策。
無論覆寫模式為何,只要 Job 有任何子項政策,就無法變更。
ZX_JOB_POL_TIMER_SLACK
ZX_JOB_POL_TIMER_SLACK
的「主題」表示 policy 為:
typedef struct zx_policy_timer_slack {
zx_duration_t min_slack;
uint32_t default_mode;
} zx_policy_timer_slack_t;
min_slack :指定對工作建立的計時器和期限型事件套用的 Span 下限。
如果父項工作的 min_slack 大於指定的 min_slack,系統會改用父項工作的值。換句話說,工作的 min_slack 是指定值及其父項工作的 min_slack 的最大值。
default_mode:指定在系統呼叫引數未指定時,系統套用 slack 的方式。無論父項工作的 default_mode 為何,您都可以設定工作的 default_mode。default_mode 可能的值包括:
ZX_TIMER_SLACK_CENTER
ZX_TIMER_SLACK_EARLY
ZX_TIMER_SLACK_LATE
詳情請參閱計時器腳架。
設定計時器堆疊政策時,選項必須為 ZX_JOB_POL_RELATIVE
,且 count
必須為 1。
權限
handle 必須是 ZX_OBJ_TYPE_JOB
類型,且具有 ZX_RIGHT_SET_POLICY
。
傳回值
zx_job_set_policy()
會在成功時傳回 ZX_OK
。如果失敗,系統會傳回負值錯誤值。
附註
使用 ZX_INFO_HANDLE_VALID
主題呼叫 zx_object_get_info()
時,一律不會套用 ZX_POL_BAD_HANDLE
政策。所有其他主題和處理程序的所有其他系統呼叫均須遵守該政策 (如已啟用)。
錯誤
ZX_ERR_INVALID_ARGS
政策不是有效指標、count 為 0、policy 不是 ZX_JOB_POL_RELATIVE
或 ZX_JOB_POL_ABSOLUTE
,或者 topic 不是 ZX_JOB_POL_BASIC
。
ZX_ERR_BAD_HANDLE
帳號代碼無效。
ZX_ERR_WRONG_TYPE
處理常式不是工作控制代碼。
ZX_ERR_ACCESS_DENIED
帳號代碼沒有 ZX_POL_RIGHT_SET
權利。
ZX_ERR_BAD_STATE
工作已有執行中的工作或程序。
ZX_ERR_OUT_OF_RANGE
計數大於 ZX_POL_MAX
,或條件大於 ZX_POL_MAX
。
有 ZX_ERR_ALREADY_EXISTS
項現有政策與新政策相衝突。
ZX_ERR_NOT_SUPPORTED
policy 中的項目具有無效值。
ZX_ERR_NO_MEMORY
因記憶體不足而失敗。使用者空間無法以任何方式處理這個錯誤 (極可能) 錯誤。日後的建構作業不會再發生這個錯誤。