z_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:政策会应用于 policy 或 系统调用失败。

此调用成功后,任何新的子进程或子作业都将具有新的 有效政策。

topic 表示 policy 格式。支持的值包括 ZX_JOB_POL_BASIC_V1ZX_JOB_POL_BASIC_V2ZX_JOB_POL_TIMER_SLACK

ZX_JOB_POL_BASIC_V2 and V1

topicZX_JOB_POL_BASIC_V2 表示 policycount 的数组 条目:

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

topicZX_JOB_POL_BASIC_V1 表示 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:此作业下的进程正在尝试 发出具有无效句柄的系统调用。在此示例中 ZX_POL_ACTION_ALLOWZX_POL_ACTION_DENY 等效: 如果系统调用返回,它将始终返回错误 ZX_ERR_BAD_HANDLE
  • ZX_POL_WRONG_OBJECT:此作业下的进程正在尝试 发出具有不支持此类操作的句柄的系统调用。
  • ZX_POL_VMAR_WX:此作业下的进程正在尝试映射 具有写入执行访问权限的地址区域。
  • 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:此作业下正在尝试创建的进程 新的 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_KIND_SYSTEM 资源, ZX_RSRC_SYSTEM_VMEX_BASE
  • 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。

其中,policy 适用于 ZX_JOB_POL_BASIC_V1action 适用于 ZX_JOB_POL_BASIC_V2 为其中之一

  • ZX_POL_ACTION_ALLOW 允许条件
  • 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 指定应用于计时器的最小 Slack 数量 作业创建的基于截止时间的事件。

如果父级作业的 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

如需了解详情,请参阅计时器延迟

设置计时器 Slack 政策时,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 policy 不是有效指针,或 count 为 0。 或 policy 不是 ZX_JOB_POL_RELATIVEZX_JOB_POL_ABSOLUTE,或者 “topic”不是“ZX_JOB_POL_BASIC”。

ZX_ERR_BAD_HANDLE handle 不是有效的句柄。

ZX_ERR_WRONG_TYPE handle 不是作业句柄。

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_SUPPORTEDpolicy 中的条目包含无效值。

ZX_ERR_NO_MEMORY 因内存不足而失败。 用户空间没有好办法处理这种(不太可能)错误。 在将来的版本中,此错误不会再发生。

另请参阅