zx_job_set_policy

摘要

設定工作安全性和資源政策。

宣告

#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_V1ZX_JOB_POL_BASIC_V2ZX_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_ALLOWZX_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_VMOZX_POL_NEW_CHANNELZX_POL_NEW_EVENTZX_POL_NEW_EVENTPAIRZX_POL_NEW_PORTZX_POL_NEW_SOCKETZX_POL_NEW_FIFO,以及日後的任何 ZX_NEW 政策。這將包括任何不需要父項物件建立的新核心物件。
  • ZX_POL_NEW_IOB 執行這項工作的程序正嘗試建立新的 IOBuffer。

其中 ZX_JOB_POL_BASIC_V1policyZX_JOB_POL_BASIC_V2action 是以下任一個值:

  • ZX_POL_ACTION_ALLOW 允許條件
  • ZX_POL_ACTION_DENY 預防了限制條件
  • ZX_POL_ACTION_ALLOW_EXCEPTION 會透過偵錯通訊埠產生例外狀況。以這種方式產生的例外狀況可做為中斷點。可在例外狀況後恢復執行緒。重新啟用後,系統會允許觸發例外狀況的條件完成,就像沒有違反政策的情況一樣。
  • ZX_POL_ACTION_DENY_EXCEPTIONZX_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_modedefault_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_RELATIVEZX_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 因記憶體不足而失敗。使用者空間無法以任何方式處理這個錯誤 (極可能) 錯誤。日後的建構作業不會再發生這個錯誤。

另請參閱