摘要
请求各种内核对象的各种属性。
声明
#include <zircon/syscalls.h>
zx_status_t zx_object_get_property(zx_handle_t handle,
uint32_t property,
void* value,
size_t value_size);
说明
zx_object_get_property()
请求内核对象的属性值。
要获取属性,您需要具备标识名的 ZX_RIGHT_GET_PROPERTY
权限。
handle 参数表示目标内核对象。不同的媒体资源 仅适用于某些类型的内核对象,如下所述。
property 参数指示要获取/设置的属性。属性值
的前缀为 ZX_PROP_
,具体说明如下。
value 参数包含属性值,并且必须是指向 value_size 字节的缓冲区。不同的属性需要不同的值 类型/尺寸(如下所述)。
房源
属性值带有 ZX_PROP_
前缀,并在
#include <zircon/syscalls/object.h>
ZX_PROP_NAME
handle 类型:以下任意一项:
- 作业
- 流程
- 线程
- 资源
- 虚拟内存对象 (VMO)
- 总线交易发起者 (BTI)
value 类型:char[ZX_MAX_NAME_LEN]
允许的操作:get
、set
对象的名称,表示为以 NUL 结尾的字符串。
尝试获取或设置已退出线程的名称将失败并显示 ZX_ERR_BAD_STATE
。
ZX_PROP_REGISTER_FS 和 ZX_PROP_REGISTER_GS
handle 类型:Thread
value 类型:uintptr_t
允许的操作:get
、set
分别是 x86 FS.BASE 或 GS.BASE 寄存器的值。value
必须
是规范地址。尝试设置非规范地址将会失败,并显示
ZX_ERR_INVALID_ARGS
。
这是 rdfsbase
、wrfsbase
和 rdgsbase
的软件替代程序,
较新的 x86-64 CPU 支持 wrgsbase
个指令对,并且应该行为
这与直接使用 CPU 指令完全相同(不同的是,
尝试设置非规范地址,因为该值只会收到错误
而不是生成机器异常)。在使用
支持这些指令(由 cpuid
指令报告),它是
更高效、更简单地直接使用机器指令。
仅针对 x86-64 定义。在其他架构上返回 ZX_ERR_NOT_SUPPORTED
。
如果未从当前线程调用,则返回 ZX_ERR_ACCESS_DENIED
。
ZX_PROP_PROCESS_DEBUG_ADDR
handle 类型:Process
value 类型:uintptr_t
允许的操作:get
、set
ld.so 的 _dl_debug_addr
的值。调试程序可以使用它来
请求动态加载器的状态。
ZX_PROP_PROCESS_BREAK_ON_LOAD
handle 类型:Process
value 类型:uintptr_t
允许的操作:get
、set
确定动态加载程序是否会在每次加载 共享库。如果在进程的第一个线程运行之前设置,它也会 针对初始加载触发调试陷阱。
动态加载程序将 ZX_PROP_PROCESS_DEBUG_ADDR
的预期值设置为
触发此调试陷阱。异常处理程序可以使用该属性查询
动态加载器的状态。
当动态加载程序发出调试 trap 时,还会将
将 ZX_PROP_PROCESS_BREAK_ON_LOAD
设置为调试 trap 的地址,以便
调试程序可以将该值与异常地址进行比较,
确定调试 trap 是否由动态加载器触发。
任何非零值都被视为启用此功能。将此属性设置为 则将其停用调试程序也可以使用此属性来检测 已有另一个调试程序连接到同一进程。
ZX_PROP_PROCESS_VDSO_BASE_ADDRESS
handle 类型:Process
value 类型:uintptr_t
允许的操作:get
vDSO 映射的基础地址,或零。
ZX_PROP_PROCESS_HW_TRACE_CONTEXT_ID
handle 类型:Process
value 类型:uintptr_t
允许的操作:get
上下文 ID 用于区分硬件指令跟踪中的不同进程。 在 Intel X86-64 上,这是寄存器 CR3 的值。
要获取 ZX_PROP_PROCESS_HW_TRACE_CONTEXT_ID
,您必须指定
kernel.enable-debugging-syscalls=true
(在内核命令行中)。否则
该函数会返回 ZX_ERR_NOT_SUPPORTED
。
目前仅为 X86 定义。
ZX_PROP_SOCKET_RX_THRESHOLD
handle 类型:Socket
value 类型:size_t
允许的操作:get
、set
套接字的读取阈值的大小(以字节为单位)。设置此项
如果可以读取的数据量,则断言 ZX_SOCKET_READ_THRESHOLD
大于或等于阈值。将此属性设置为零
会导致 ZX_SOCKET_READ_THRESHOLD
被取消断言。
设置的值大于
套接字将失败,并显示 ZX_ERR_INVALID_ARGS
。
ZX_PROP_SOCKET_TX_THRESHOLD
handle 类型:Socket
value 类型:size_t
允许的操作:get
、set
套接字的写入阈值大小(以字节为单位)。设置此项
如果可用于写入的空间量,则断言 ZX_SOCKET_WRITE_THRESHOLD
大于或等于阈值。将此属性设置为零
会导致 ZX_SOCKET_WRITE_THRESHOLD
被取消断言。将
写入阈值,则会导致错误,
返回 ZX_ERR_PEER_CLOSED
错误。
设置的值大于
套接字将失败,并显示 ZX_ERR_INVALID_ARGS
。
ZX_PROP_JOB_KILL_ON_OOM
handle 类型:Job
value 类型:size_t
允许的操作:set
值为 1 表示在以下情况下,Job 及其子项将被终止:
系统发现自身处于系统级内存不足的情况。已与 0 通话
(这是默认设置)
场景。设置为任何其他值都将失败并显示 ZX_ERR_INVALID_ARGS
。
ZX_PROP_EXCEPTION_STATE
handle 类型:Exception
value 类型:uint32_t
允许的操作:get
、set
如果设置为ZX_EXCEPTION_STATE_HANDLED
,关闭异常句柄会
完成异常处理并恢复底层线程。
如果设置为ZX_EXCEPTION_STATE_TRY_NEXT
,关闭异常句柄会
按顺序尝试下一个处理程序以继续进行异常处理。
如果设置为ZX_EXCEPTION_STATE_THREAD_EXIT
,关闭异常句柄会
会导致生成异常的线程退出。
设置为任何其他值都将失败并显示 ZX_ERR_INVALID_ARGS
。
ZX_PROP_EXCEPTION_STRATEGY
handle 类型:Exception
value 类型:uint32_t
允许的操作:get
、set
如果设置了 ZX_EXCEPTION_STRATEGY_SECOND_CHANCE
,调试程序将收到
概率处理异常。
如果设置了 ZX_EXCEPTION_STRATEGY_FIRST_CHANCE
,则调试程序不会获取
第二次处理异常的机会
设置为任何其他值都将失败并显示 ZX_ERR_INVALID_ARGS
。
仅当句柄对应到一个调试程序进程时,才能设置此属性
异常渠道。当异常渠道时尝试设置此属性
是任何其他类型,都会导致 ZX_ERR_BAD_STATE
。
ZX_PROP_STREAM_MODE_APPEND
handle 类型:Stream
value 类型:uint8_t
允许的操作:get
、set
当数据流处于附加模式时,此属性具有值 1
,并且
值为 0
,则表示数据流未处于附加模式。附加模式下的数据流将
以原子方式将音频流的定位偏移量设置为该流的内容大小
然后才能在 zx_stream_writev()
中写入数据。
权限
handle 必须具有 ZX_RIGHT_GET_PROPERTY
,并且必须是受支持的 ZX_OBJ_TYPE_
(如上文各个属性的说明中所述)。
返回值
如果成功,zx_object_get_property()
会返回 ZX_OK
。如果出现
失败,则返回负的错误值。
错误
上述说明中记录了各个 property 值的具体错误。 常见错误如下:
ZX_ERR_BAD_HANDLE
:handle 不是有效的句柄。
ZX_ERR_WRONG_TYPE
:handle 类型不是 property 的合适类型。
ZX_ERR_ACCESS_DENIED
:handle 不具备
操作。
ZX_ERR_INVALID_ARGS
:value 是无效的指针。
ZX_ERR_NO_MEMORY
因内存不足而失败。
用户空间没有好办法处理这种(不太可能)错误。
在将来的版本中,此错误不会再发生。
ZX_ERR_BUFFER_TOO_SMALL
:value_size 对 property 而言过小。
ZX_ERR_NOT_SUPPORTED
:属性不存在。