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);

說明

將一或多項安全性和/或資源政策設為空白工作。工作的 有效的政策則是父項有效政策與 policy 中指定的政策。如果您 現有政策和新政策是由 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_V2topic 表示 policycount 的陣列 項目:

typedef struct zx_policy_basic {
    uint32_t condition;
    uint32_t action;
    uint32_t flags;
} zx_policy_basic_v2_t;

ZX_JOB_POL_BASIC_V1topic 表示 policycount 的陣列 項目:

// 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 正嘗試執行這項工作的處理程序 發出含有無效帳號代碼的 syscall。在本例中 ZX_POL_ACTION_ALLOWZX_POL_ACTION_DENY 等於: 如果系統呼叫傳回,則一律會傳回錯誤 ZX_ERR_BAD_HANDLE
  • ZX_POL_WRONG_OBJECT 正嘗試執行這項工作的處理程序 透過不支援該作業的帳號代碼發出 Syscall。
  • 此工作中的 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 正嘗試建立這項工作下的程序 新敵人
  • ZX_POL_NEW_TIMER 正嘗試建立這項工作下的程序 設定新計時器
  • ZX_POL_NEW_PROCESS 正嘗試建立這項工作下的程序 新的流程
  • ZX_POL_NEW_PROFILE 正嘗試建立這項工作下的程序 建立新的設定檔
  • ZX_POL_NEW_PAGER 正嘗試建立這項工作下的程序 或開啟新的 VMO 呼叫器
  • ZX_POL_AMBIENT_MARK_VMO_EXEC 正嘗試執行這項工作中的程序 搭配 ZX_HANDLE_INVALID 使用 zx_vmo_replace_as_executable() 做為第二個引數,而不是具有基本底數的有效 ZX_RSRC_KIND_SYSTEM 資源 ZX_RSRC_SYSTEM_VMEX_BASE
  • ZX_POL_NEW_ANY 是特殊的限制條件,代表所有的 上述 ZX_NEW 條件,例如 ZX_POL_NEW_VMO ZX_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_V1 政策ZX_JOB_POL_BASIC_V2動作 是以下任一個值:

  • ZX_POL_ACTION_ALLOW 允許 condition 屬性。
  • ZX_POL_ACTION_DENY 避免出現 condition 狀況。
  • ZX_POL_ACTION_ALLOW_EXCEPTION 會透過偵錯通訊埠產生例外狀況。 透過這種方式產生的例外狀況可做為中斷點。討論串可能是 就會繼續執行。重新啟用後,條件就會觸發 則可視為未違反政策時的例外狀況。
  • ZX_POL_ACTION_DENY_EXCEPTIONZX_POL_ACTION_ALLOW_EXCEPTION一樣, 但在恢復之後,condition 將會遭拒,通常會導致 ZX_ERR_ACCESS_DENIED
  • ZX_POL_ACTION_KILL 終止程序。

其中 flags 是之一

  • ZX_POL_OVERRIDE_ALLOW允許變更子項工作的這項政策。
  • ZX_POL_OVERRIDE_DENY 不允許變更子項工作這項政策。

無論覆寫模式為何,只要 Job 具有任何子項政策 可能會發生變化

ZX_JOB_POL_TIMER_SLACK

如果 topicZX_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 會指定計時器適用的最低曝光量,以及 由工作建立的期限型事件。

如果父項工作的 min_slack 大於指定的 min_slack,則 則會使用父項工作的值也就是說,工作的 min_slack 是 指定值的最大值,以及其父項工作的 min_slack

default_mode 指定在未另外指定的情況下套用 slack 的方式 是由 Syscall 引數傳回工作的 default_mode 父項工作的 default_modedefault_mode 可能的值包括:

  • ZX_TIMER_SLACK_CENTER
  • ZX_TIMER_SLACK_EARLY
  • ZX_TIMER_SLACK_LATE

詳情請參閱計時器滑桿

設定計時器休眠政策時,options 必須為 ZX_JOB_POL_RELATIVE,且 count 必須是 1。

權限

handle 必須是 ZX_OBJ_TYPE_JOB 類型,且包含 ZX_RIGHT_SET_POLICY

傳回值

zx_job_set_policy() 會在成功時傳回 ZX_OK。萬一發生錯誤 傳回的錯誤值

附註

呼叫 zx_object_get_info() 時一律不會套用 ZX_POL_BAD_HANDLE 政策 「ZX_INFO_HANDLE_VALID」主題。所有其他主題和所有其他系統呼叫 若使用帳號代碼,則須遵守政策規定。

錯誤

ZX_ERR_INVALID_ARGS 政策不是有效的指標,或 count 為 0, 或政策不是 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 count 大於 ZX_POL_MAXcondition 為 大於 ZX_POL_MAX

ZX_ERR_ALREADY_EXISTS 項現有政策與新政策發生衝突。

ZX_ERR_NOT_SUPPORTED 政策中的項目包含無效值。

ZX_ERR_NO_MEMORY 因記憶體不足而失敗。 使用者空間無法妥善處理這種 (異常) 錯誤。 在日後的版本中不會再發生這個錯誤。

另請參閱