摘要
设置作业安全和资源政策。
声明
#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_V1
、
ZX_JOB_POL_BASIC_V2
和ZX_JOB_POL_TIMER_SLACK
。
ZX_JOB_POL_BASIC_V2 and V1
topic 为 ZX_JOB_POL_BASIC_V2
表示 policy 是 count 的数组
条目:
typedef struct zx_policy_basic {
uint32_t condition;
uint32_t action;
uint32_t flags;
} zx_policy_basic_v2_t;
topic 为 ZX_JOB_POL_BASIC_V1
表示 policy 是 count 的数组
条目:
// 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
等效: 如果系统调用返回,它将始终返回错误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_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。
其中,policy 适用于 ZX_JOB_POL_BASIC_V1
或 action 适用于 ZX_JOB_POL_BASIC_V2
为其中之一
ZX_POL_ACTION_ALLOW
允许条件。ZX_POL_ACTION_DENY
可防止 condition。ZX_POL_ACTION_ALLOW_EXCEPTION
会通过调试端口生成异常。 以这种方式生成的异常充当断点。该消息串可能是 恢复了恢复后,触发 例外,就像未发生任何违规问题一样。ZX_POL_ACTION_DENY_EXCEPTION
和ZX_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
topic 为 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 指定应用于计时器的最小 Slack 数量 作业创建的基于截止时间的事件。
如果父级作业的 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
如需了解详情,请参阅计时器延迟。
设置计时器 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_RELATIVE
或 ZX_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_MAX
或 condition 为
大于 ZX_POL_MAX
。
ZX_ERR_ALREADY_EXISTS
项现有政策与新政策冲突。
ZX_ERR_NOT_SUPPORTED
:policy 中的条目包含无效值。
ZX_ERR_NO_MEMORY
因内存不足而失败。
用户空间没有好办法处理这种(不太可能)错误。
在将来的版本中,此错误不会再发生。