zx_object_get_info


英文原文快照


名称

object_get_info —— 查询对象的相关信息

概要

  1. #include <zircon/syscalls.h>
  2. #include <zircon/syscalls/object.h>
  3. zx_status_t zx_object_get_info(zx_handle_t handle, uint32_t topic,
  4. void* buffer, size_t buffer_size,
  5. size_t* actual, size_t* avail);

描述

object_get_info() 请求获取提供的句柄(或句柄引用的对象)的相关信息。 topic参数表示所需要的特定信息的主题。 buffer是指向大小为buffer_size的缓冲区指针,用于存放返回的信息。

actual是一个可选的指针,用于返回写入缓冲区的记录条数。 avail是一个可选的指针,用于返回可读取的记录条数。

如果buffer缓冲区长度不够,那么avail将大于actual的值。

主题

ZX_INFO_HANDLE_VALID

handle类型:任意

buffer类型:n/a

如果handle有效,则返回ZX_OK;否则返回ZX_ERR_BAD_HANDLE。 该主题不返回任何记录,同时buffer可以为NULL

ZX_INFO_HANDLE_BASIC

handle类型:任意

buffer类型:zx_info_handle_basic_t[1]

  1. typedef struct zx_info_handle_basic {
  2. // 内核为句柄引用的对象分配的唯一ID。
  3. zx_koid_t koid;
  4. // 分配给句柄的不可变权限。
  5. // 具有相同的koid和相同权限的两个句柄是等效和可互换的。
  6. zx_rights_t rights;
  7. // 对象类型:通道,事件,套接字等。
  8. uint32_t type; // zx_obj_type_t;
  9. // 如果句柄引用的对象与另一个对象(例如通道的另一端或父级作业)相关,那么|related_koid| 是该对象的koid,否则为零。
  10. // 这种关系是不可变的:即使相关对象不再存在,对象的|related_koid|也不会改变。
  11. zx_koid_t related_koid;
  12. // 如果句柄引用的对象是可等待的,则设置为ZX_OBJ_PROP_WAITABLE;否则为零。
  13. uint32_t props; // zx_obj_props_t;
  14. } zx_info_handle_basic_t;

ZX_INFO_HANDLE_COUNT

handle类型:任意

buffer类型:zx_info_handle_count_t[1]

  1. typedef struct zx_info_handle_count {
  2. // 内核对象被句柄引用的次数。
  3. uint32_t handle_count;
  4. } zx_info_handle_count_t;

handle_count应仅用作调试的辅助工具。 不要使用它来检查不受信任的进程是否无法修改某个内核对象。 由于系统调度程序是异步的,因此可能存在一个时间窗口:在该时间窗口期间,即使对象最后一个句柄从一个进程转移到另一个进程,也可以由先前的句柄所有者修改对象。

ZX_INFO_PROCESS_HANDLE_STATS

handle类型:进程

buffer类型:zx_info_process_handle_stats_t[1]

  1. typedef struct zx_info_process_handle_stats {
  2. // 每种类型的内核对象被句柄引用的次数。
  3. uint32_t handle_count[ZX_OBJ_TYPE_LAST];
  4. } zx_info_process_handle_stats_t;

ZX_INFO_PROCESS

handle类型:进程

buffer类型:zx_info_process_t[1]

  1. typedef struct zx_info_process {
  2. // 进程的返回码;仅在|exited|为true时有效。
  3. // 如果进程被|zx_task_kill|强制结束,则保证该字段为非零。
  4. int64_t return_code;
  5. // 如果进程已结束创建状态,则即使该进程已退出,该字段也为true。
  6. bool started;
  7. // 如果该字段为true,则进程已退出并且|return_code|有效。
  8. bool exited;
  9. // 如果调试器已附加到进程,则该字段为true。
  10. bool debugger_attached;
  11. } zx_info_process_t;

ZX_INFO_PROCESS_THREADS

handle类型:进程

buffer类型:zx_koid_t[n] 返回zx_koid_t类型的数组,其中每一个对应于提供的进程句柄的其中一个线程。

注:获取线程列表会带来本质上的竞争。 在此之前暂停所有线程可以稍微减轻这个问题,但请注意外部线程也可以创建新线程。 actual包含buffer中返回的线程数。 avail包含获取线程列表时进程的线程总数,因此实际线程数可能大于actual

ZX_INFO_THREAD

handle类型:线程

buffer类型:zx_info_thread_t[n]

  1. typedef struct zx_info_thread {
  2. // ZX_THREAD_STATE_*值之一。
  3. uint32_t state;
  4. // 如果|state|是ZX_THREAD_STATE_BLOCKED_EXCEPTION,线程在遇到异常时等待指定端口处理异常。
  5. // 该字段的值是ZX_EXCEPTION_PORT_TYPE_*之一。
  6. uint32_t wait_exception_port_type;
  7. } zx_info_thread_t;

此结构中的值主要用于提供信息和调试目的。

ZXTHREAD_STATE* 值由以下头文件定义:

  1. #include <zircon/syscalls/object.h>
  • ZX_THREAD_STATE_NEW:线程已创建,但尚未开始运行。
  • ZX_THREAD_STATE_RUNNING:线程处于正常运行用户代码状态。
  • ZX_THREAD_STATE_SUSPENDED:线程由于zx_task_suspend而停止。
  • ZX_THREAD_STATE_BLOCKED:线程在系统调用或处理异常中。 该值永远不会自行返回。 请参阅下面的ZXTHREAD_STATE_BLOCKED*
  • ZX_THREAD_STATE_DYING:线程正在终止,但尚未停止。
  • ZX_THREAD_STATE_DEAD:线程已停止运行。

当线程在阻塞型系统调用内停止或在异常中停止时,state中返回的值是以下之一: <!— ZX_THREAD_STATE_BLOCKED_EXCEPTION*: The thread is stopped in an exception.

  • ZX_THREAD_STATE_BLOCKED_SLEEPING: The thread is stopped in zx_nanosleep.
  • ZX_THREAD_STATE_BLOCKED_FUTEX: The thread is stopped in zx_futex_wait.
  • ZX_THREAD_STATE_BLOCKED_PORT: The thread is stopped in zx_port_wait.
  • ZX_THREAD_STATE_BLOCKED_CHANNEL: The thread is stopped in zx_channel_call.
  • ZX_THREAD_STATE_BLOCKED_WAIT_ONE: The thread is stopped in zx_object_wait_one.
  • ZX_THREAD_STATE_BLOCKED_WAIT_MANY: The thread is stopped in zx_object_wait_many.
  • ZX_THREAD_STATE_BLOCKED_INTERRUPT: The thread is stopped in zx_interrupt_wait. —>

  • ZX_THREAD_STATE_BLOCKED_EXCEPTION:线程在异常中停止。

  • ZX_THREAD_STATE_BLOCKED_SLEEPING:线程在zx_nanosleep调用中停止。
  • ZX_THREAD_STATE_BLOCKED_FUTEX:线程在zx_futex_wait调用中停止。
  • ZX_THREAD_STATE_BLOCKED_PORT:线程在zx_port_wait调用中停止。
  • ZX_THREAD_STATE_BLOCKED_CHANNEL:线程在zx_channel_call调用中停止。
  • ZX_THREAD_STATE_BLOCKED_WAIT_ONE:线程在zx_object_wait_one调用中停止。
  • ZX_THREAD_STATE_BLOCKED_WAIT_MANY:线程在zx_object_wait_many调用中停止。
  • ZX_THREAD_STATE_BLOCKED_INTERRUPT:线程在zx_interrupt_wait中调用停止。

ZXEXCEPTION_PORT_TYPE* 值由以下头文件定义:

  1. #include <zircon/syscalls/exception.h>
  • ZX_EXCEPTION_PORT_TYPE_NONE
  • ZX_EXCEPTION_PORT_TYPE_DEBUGGER
  • ZX_EXCEPTION_PORT_TYPE_THREAD
  • ZX_EXCEPTION_PORT_TYPE_PROCESS
  • ZX_EXCEPTION_PORT_TYPE_JOB

ZX_INFO_THREAD_EXCEPTION_REPORT

handle类型:线程

buffer类型:zx_exception_report_t[1]

  1. #include <zircon/syscalls/exception.h>

如果线程当前处于异常中并且正在等待异常响应,则调用会将异常报告作为单个zx_exception_report_t和状态ZX_OK一起返回。

如果线程不在异常中并等待异常响应,则返回ZX_ERR_BAD_STATE

ZX_INFO_THREAD_STATS

handle类型:线程

buffer类型:zx_info_thread_stats[1]

  1. typedef struct zx_info_thread_stats {
  2. // 线程累计总运行时间。
  3. zx_duration_t total_runtime;
  4. } zx_info_thread_stats_t;

ZX_INFO_CPU_STATS

注意:因考虑使用不同的机制,该主题的许多值正在被弃用中。 handle类型:资源(具体来讲是根资源) buffer类型:zx_info_cpu_stats_t[1] <!—

  1. typedef struct zx_info_cpu_stats {
  2. uint32_t cpu_number;
  3. uint32_t flags;
  4. zx_duration_t idle_time;
  5. // kernel scheduler counters
  6. uint64_t reschedules;
  7. uint64_t context_switches;
  8. uint64_t irq_preempts;
  9. uint64_t preempts;
  10. uint64_t yields;
  11. // cpu level interrupts and exceptions
  12. uint64_t ints; // hardware interrupts, minus timer interrupts
  13. // inter-processor interrupts
  14. uint64_t timer_ints; // timer interrupts
  15. uint64_t timers; // timer callbacks
  16. uint64_t page_faults; // (deprecated, returns 0)
  17. uint64_t exceptions; // (deprecated, returns 0)
  18. uint64_t syscalls;
  19. // inter-processor interrupts
  20. uint64_t reschedule_ipis;
  21. uint64_t generic_ipis;
  22. } zx_info_cpu_stats_t;
  23. ``` -->

typedef struct zx_info_cpu_stats { uint32_t cpu_number; uint32_t flags;

  1. zx_duration_t idle_time;
  2. // 内核调度程序计数器
  3. uint64_t reschedules;
  4. uint64_t context_switches;
  5. uint64_t irq_preempts;
  6. uint64_t preempts;
  7. uint64_t yields;
  8. // cpu级别的中断和异常
  9. uint64_t ints; // 硬件中断次数,减去定时器中
  10. // 断和处理器间中断次数
  11. uint64_t timer_ints; // 定时器中断次数
  12. uint64_t timers; // 定时器回调次数
  13. uint64_t page_faults; // (已弃用,并返回0)
  14. uint64_t exceptions; // (已弃用,并返回0)
  15. uint64_t syscalls;
  16. // 处理器间中断次数
  17. uint64_t reschedule_ipis;
  18. uint64_t generic_ipis;

} zx_info_cpu_stats_t;

  1. ### ZX_INFO_VMAR
  2. <!-- *handle* type: **VM Address Region** -->
  3. *handle*类型:**虚拟内存地址区域(VMAR)**
  4. <!-- *buffer* type: **zx_info_vmar_t[1]** -->
  5. *buffer*类型:**zx_info_vmar_t[1]**
  6. <!--

typedef struct zx_info_vmar { // Base address of the region. uintptr_t base;

  1. // Length of the region, in bytes.
  2. size_t len;

} zx_info_vmar_t;

typedef struct zx_info_vmar { // 区域的基地址 uintptr_t base;

  1. // 区域的长度,以字节为单位
  2. size_t len;

} zx_info_vmar_t;

  1. <!-- This returns a single *zx_info_vmar_t* that describes the range of address
  2. space that the VMAR occupies. -->
  3. 调用返回单个*zx_info_vmar_t*类型,它描述了VMAR占用的地址空间的范围。
  4. ### ZX_INFO_VMO
  5. <!-- *handle* type: **VM Object** -->
  6. *handle*类型:**虚拟内存对象(VMO)**
  7. <!-- *buffer* type: **zx_info_vmo_t[1]** -->
  8. *buffer*类型:**zx_info_vmo_t[1]**
  9. <!--

typedef struct zx_info_vmo { // The koid of this VMO. zx_koid_t koid;

  1. // The name of this VMO.
  2. char name[ZX_MAX_NAME_LEN];
  3. // The size of this VMO.
  4. uint64_t size_bytes;
  5. // If this VMO is a clone, the koid of its parent. Otherwise, zero.
  6. zx_koid_t parent_koid;
  7. // The number of clones of this VMO, if any.
  8. size_t num_children;
  9. // The number of times this VMO is currently mapped into VMARs.
  10. size_t num_mappings;
  11. // An estimate of the number of unique address spaces that
  12. // this VMO is mapped into.
  13. size_t share_count;
  14. // Bitwise OR of ZX_INFO_VMO_* values.
  15. uint32_t flags;
  16. // If |ZX_INFO_VMO_TYPE(flags) == ZX_INFO_VMO_TYPE_PAGED|, the amount of
  17. // memory currently allocated to this VMO.
  18. uint64_t committed_bytes;
  19. // If |flags & ZX_INFO_VMO_VIA_HANDLE|, the handle rights.
  20. // Undefined otherwise.
  21. zx_rights_t handle_rights;
  22. // VMO creation options. This is a bitmask of
  23. // kResizable = (1u << 0);
  24. // kContiguous = (1u << 1);
  25. uint32_t create_options;

} zx_info_vmo_t;

  1. ```
  2. // 描述VMO。
  3. typedef struct zx_info_vmo {
  4. // 该VMO的koid值。
  5. zx_koid_t koid;
  6. // 该VMO的名称
  7. char name[ZX_MAX_NAME_LEN];
  8. // 该VMO的大小,即映射时它消耗的虚拟地址空间大小。
  9. uint64_t size_bytes;
  10. // 如果此VMO是其他某个VMO的副本,则为其父VMO的koid值,否则为零。
  11. // 关于副本的类型,参见|flags|。
  12. zx_koid_t parent_koid;
  13. // 该VMO的副本数(如果有的话)。
  14. size_t num_children;
  15. // 此VMO当前映射到VMAR的次数。
  16. // 请注意,相同的进程通常会将同一个VMO映射两次,并且这两个映射都将计入此处。 (即,这不是映射此VMO的进程数的计数;请参阅share_count。)
  17. size_t num_mappings;
  18. // 估计此VMO映射到的唯一地址空间的数量。
  19. // 每个进程都有自己的地址空间,内核也是如此。
  20. size_t share_count;
  21. // ZX_INFO_VMO_*的按位取或值。
  22. uint32_t flags;
  23. // 如果|ZX_INFO_VMO_TYPE(flags) == ZX_INFO_VMO_TYPE_PAGED|成立,该字段表示当前分配给此VMO的内存量,即它消耗的物理内存量,否则是未定义值。
  24. uint64_t committed_bytes;
  25. // 如果|flags & ZX_INFO_VMO_VIA_HANDLE|成立,该字段表示句柄的权限,否则是未定义值。
  26. zx_rights_t handle_rights;‘
  27. // VMO创建的标志位,是以下标识为的取或值:
  28. // kResizable = (1u << 0);
  29. // kContiguous = (1u << 1);
  30. uint32_t create_options;
  31. } zx_info_vmo_t;

调用返回单个zx_info_vmo_t类型的值,它描述了VMO的各种属性。

ZX_INFO_SOCKET

handle类型:Socket

buffer类型:zx_info_socket_t[1]

  1. typedef struct zx_info_socket {
  2. // 创建时传递给zx_socket_create()的选项。
  3. uint32_t options;
  4. // ZX_PROP_SOCKET_RX_BUF_MAX的值。
  5. size_t rx_buf_max;
  6. // ZX_PROP_SOCKET_RX_BUF_SIZE的值。
  7. size_t rx_buf_size;
  8. // ZX_PROP_SOCKET_TX_BUF_MAX的值。
  9. // 如果对等端点已关闭,则该字段为零。
  10. size_t tx_buf_max;
  11. // ZX_PROP_SOCKET_TX_BUF_SIZE的值。
  12. // 如果对等端点已关闭,则该字段为零。
  13. size_t tx_buf_size;
  14. } zx_info_socket_t;

ZX_INFO_JOB_CHILDREN

handle类型:作业

buffer类型:zx_koid_t[n] 返回zx_koid_t类型的数组,其中每一个对应于提供的作业句柄的其中一个子作业。

ZX_INFO_JOB_PROCESSES

handle类型:作业

buffer类型:zx_koid_t[n]

返回zx_koid_t类型的数组,其中每一个对应于提供的作业句柄的其中一个子进程。

ZX_INFO_TASK_STATS

handle类型:进程

buffer类型:zx_info_task_stats_t[1]

返回有关任务使用的资源(例如内存)的统计信息。

  1. typedef struct zx_info_task_stats {
  2. // 任务中映射的内存范围的总量
  3. // 但并非所有都将由物理内存提供。
  4. size_t mem_mapped_bytes;
  5. // 对于下面的字段,如果该字节由物理内存提供,则认为该字节已提交。
  6. // 其中部分内存可能会被重复映射,并产生重复计算。
  7. // 仅映射到此任务中已提交部分的内存。
  8. size_t mem_private_bytes;
  9. // 映射到此任务和至少一个其他任务的已提交内存。
  10. size_t mem_shared_bytes;
  11. // 用于估计此任务|mem_shared_bytes|内存中负责保持活跃的比例值
  12. //
  13. // 是以下值的一个估计:
  14. // 对于每个共享的,已提交的字节:
  15. // mem_scaled_shared_bytes + = 1 /(映射此字节的任务数量)
  16. //
  17. // 该数值会严格小于mem_shared_bytes。
  18. size_t mem_scaled_shared_bytes;
  19. } zx_info_task_stats_t;

其他错误码:

  • ZX_ERR_BAD_STATE:目标进程当前未处于运行状态。

ZX_INFO_PROCESS_MAPS

handle类型:除了自身之外的其他带有ZX_RIGHT_READ权限的进程

buffer类型:zx_info_maps_t[n]

zx_info_maps_t数组是目标进程的地址空间(ASpace)/VMAR/映射(Mapping)树的深度优先前序遍历数组。

  1. typedef struct zx_info_maps {
  2. // 名称(如果有的话),否则为空字符串
  3. char name[ZX_MAX_NAME_LEN];
  4. // 基地址
  5. zx_vaddr_t base;
  6. // 以字节为单位的映射总量
  7. size_t size;
  8. // 遍历树中此节点的深度。
  9. // 该字段可用于缩进,或从zx_info_maps_t类型的数组中以深度优先前序遍历重建出树
  10. size_t depth;
  11. // 该项的类型,用于表示联合体中的哪一项是有效的。
  12. uint32_t type; // zx_info_maps_type_t
  13. union {
  14. zx_info_maps_mapping_t mapping;
  15. // 对其他类型来讲,没有其他字段。
  16. } u;
  17. } zx_info_maps_t;

每一项的depth字段描述了它与前一节点之间的关系。 其中深度为0的是根地址空间,深度为1的是根VMAR,所有其他项的深度至少为2。

要全面了解进程如何使用其VMO以及VMO如何被各种进程使用,你需要将此信息与ZX_INFO_PROCESS_VMOS结合使用。

有关此主题的示例用法,请参阅vmaps命令行工具,并通过koid转储任意进程的内存映射。

其他错误码:

  • ZX_ERR_ACCESS_DENIED:缺少适当的权限,或者进程试图在指向自己的句柄上调用此主题。 在自己的进程中调用本身是不安全的:buffer将存在于正在调用的地址空间中,并且内核在遍历地址空间时不能在缓冲区的页面中安全地触发错误。
  • ZX_ERR_BAD_STATE:目标进程当前未运行,或者其地址空间已被破坏。

ZX_INFO_PROCESS_VMOS

handle类型:除了自身之外的其他带有ZX_RIGHT_READ权限的进程

buffer类型:zx_info_vmos_t[n] zx_info_vmos_t数组是目标进程指向的所有VMO的列表。 其中部分VMO是已映射的,部分是由句柄所指向的,部分是两者皆存在。

注意:由于存在多个映射/句柄,同一个VMO可能会出现多次。 此外,由于VMO可以在目标进程运行时改变,因此在VMO的不同时刻,相同的VMO可能具有不同的值。 消解其中的任何重复项将留给调用者来处理。 要全面了解进程如何使用其VMO以及VMO如何被多个进程使用,你需要将该内容与ZX_INFO_PROCESS_MAPS结合使用。 <!—

  1. // Describes a VMO.
  2. typedef struct zx_info_vmo {
  3. // The koid of this VMO.
  4. zx_koid_t koid;
  5. // The name of this VMO.
  6. char name[ZX_MAX_NAME_LEN];
  7. // The size of this VMO; i.e., the amount of virtual address space it
  8. // would consume if mapped.
  9. uint64_t size_bytes;
  10. // If this VMO is a clone, the koid of its parent. Otherwise, zero.
  11. // See |flags| for the type of clone.
  12. zx_koid_t parent_koid;
  13. // The number of clones of this VMO, if any.
  14. size_t num_children;
  15. // The number of times this VMO is currently mapped into VMARs.
  16. // Note that the same process will often map the same VMO twice,
  17. // and both mappings will be counted here. (I.e., this is not a count
  18. // of the number of processes that map this VMO; see share_count.)
  19. size_t num_mappings;
  20. // An estimate of the number of unique address spaces that
  21. // this VMO is mapped into. Every process has its own address space,
  22. // and so does the kernel.
  23. size_t share_count;
  24. // Bitwise OR of ZX_INFO_VMO_* values.
  25. uint32_t flags;
  26. // If |ZX_INFO_VMO_TYPE(flags) == ZX_INFO_VMO_TYPE_PAGED|, the amount of
  27. // memory currently allocated to this VMO; i.e., the amount of physical
  28. // memory it consumes. Undefined otherwise.
  29. uint64_t committed_bytes;
  30. // If |flags & ZX_INFO_VMO_VIA_HANDLE|, the handle rights.
  31. // Undefined otherwise.
  32. zx_rights_t handle_rights;
  33. } zx_info_vmo_t;
  34. ``` -->

// 描述VMO。 typedef struct zx_info_vmo { // 该VMO的koid值。 zx_koid_t koid;

  1. // 该VMO的名称
  2. char name[ZX_MAX_NAME_LEN];
  3. // 该VMO的大小,即映射时它消耗的虚拟地址空间大小。
  4. uint64_t size_bytes;
  5. // 如果此VMO是其他某个VMO的副本,则为其父VMO的koid值,否则为零。
  6. // 关于副本的类型,参见|flags|。
  7. zx_koid_t parent_koid;
  8. // 该VMO的副本数(如果有的话)。
  9. size_t num_children;
  10. // 此VMO当前映射到VMAR的次数。
  11. // 请注意,相同的进程通常会将同一个VMO映射两次,并且这两个映射都将计入此处。 (即,这不是映射此VMO的进程数的计数;请参阅share_count。)
  12. size_t num_mappings;
  13. // 估计此VMO映射到的唯一地址空间的数量。
  14. // 每个进程都有自己的地址空间,内核也是如此。
  15. size_t share_count;
  16. // ZX_INFO_VMO_*的按位取或值。
  17. uint32_t flags;
  18. // 如果|ZX_INFO_VMO_TYPE(flags) == ZX_INFO_VMO_TYPE_PAGED|成立,该字段表示当前分配给此VMO的内存量,即它消耗的物理内存量,否则是未定义值。
  19. uint64_t committed_bytes;
  20. // 如果|flags & ZX_INFO_VMO_VIA_HANDLE|成立,该字段表示句柄的权限,否则是未定义值。
  21. zx_rights_t handle_rights;

} zx_info_vmo_t;

  1. <!-- See the `vmos` command-line tool for an example user of this topic, and to dump
  2. the VMOs of arbitrary processes by koid. -->
  3. 有关此主题的示例用法,请参阅`vmos`命令行工具,并通过koid转储任意进程的VMO。
  4. ### ZX_INFO_KMEM_STATS
  5. <!-- *handle* type: **Resource** (Specifically, the root resource) -->
  6. *handle*类型:**资源**(具体来讲是根资源)
  7. <!-- *buffer* type: **zx_info_kmem_stats_t[1]** -->
  8. *buffer*类型:**zx_info_kmem_stats_t[1]**
  9. <!-- Returns information about kernel memory usage. It can be expensive to gather. -->
  10. 返回有关内核内存使用情况的信息。
  11. 但是收集这些信息可能开销很大。
  12. <!--

typedef struct zx_info_kmem_stats { // The total amount of physical memory available to the system. size_t total_bytes;

  1. // The amount of unallocated memory.
  2. size_t free_bytes;
  3. // The amount of memory reserved by and mapped into the kernel for reasons
  4. // not covered by other fields in this struct. Typically for readonly data
  5. // like the ram disk and kernel image, and for early-boot dynamic memory.
  6. size_t wired_bytes;
  7. // The amount of memory allocated to the kernel heap.
  8. size_t total_heap_bytes;
  9. // The portion of |total_heap_bytes| that is not in use.
  10. size_t free_heap_bytes;
  11. // The amount of memory committed to VMOs, both kernel and user.
  12. // A superset of all userspace memory.
  13. // Does not include certain VMOs that fall under |wired_bytes|.
  14. //
  15. // TODO(dbort): Break this into at least two pieces: userspace VMOs that
  16. // have koids, and kernel VMOs that don't. Or maybe look at VMOs
  17. // mapped into the kernel aspace vs. everything else.
  18. size_t vmo_bytes;
  19. // The amount of memory used for architecture-specific MMU metadata
  20. // like page tables.
  21. size_t mmu_overhead_bytes;
  22. // Non-free memory that isn't accounted for in any other field.
  23. size_t other_bytes;

} zx_info_kmem_stats_t;

  1. ```
  2. typedef struct zx_info_kmem_stats {
  3. // 系统可用的物理内存总量。
  4. size_t total_bytes;
  5. // 未分配的内存总量。
  6. size_t free_bytes;
  7. // 保留并映射到内核,但此结构体中其他字段未涵盖的内存量。
  8. // 这部分内存通常用于读取磁盘和内核映像等只读数据,以及早期启动的动态内存。
  9. size_t wired_bytes;
  10. // 分配给内核堆空间的内存量。
  11. size_t total_heap_bytes;
  12. // |total_heap_bytes|中的未使用部分。
  13. size_t free_heap_bytes;
  14. // 提交给VMO(内核态和用户空间部分)的内存量。
  15. // 所有用户空间内存的超集,但不包括某些属于|wired_bytes|的VMO。
  16. // TODO(dbort):将其分为至少两部分:具有koid值的用户空间VMO和不具有koid的内核态VMO,或者可以考虑将VMO映射到内核空间/其他位置。
  17. size_t vmo_bytes;
  18. // 用于特定于体系结构的MMU元数据(如页表)的内存量。
  19. size_t mmu_overhead_bytes;
  20. // 在任何其他字段中未包含在内的非空闲内存。
  21. size_t other_bytes;
  22. } zx_info_kmem_stats_t;

ZX_INFO_RESOURCE

handle类型:资源

buffer类型:zx_info_resource_t[1]

通过其句柄返回有关资源对象的信息。

  1. typedef struct zx_info_resource {
  2. // 资源种类
  3. uint32_t kind;
  4. // 资源的最低值(包括)
  5. uint64_t low;
  6. // 资源的最高值(包括)
  7. uint64_t high;
  8. } zx_info_resource_t;

资源类型为下列其中之一:

  • ZX_RSRC_KIND_ROOT
  • ZX_RSRC_KIND_MMIO
  • ZX_RSRC_KIND_IOPORT
  • ZX_RSRC_KIND_IRQ
  • ZX_RSRC_KIND_HYPERVISOR

ZX_INFO_BTI

handle类型:总线事务启动器(BTI) buffer类型:zx_info_bti_t[1]

  1. typedef struct zx_info_bti {
  2. // zx_bti_pin将始终能够返回至少这么多字节的连续地址。
  3. // 例如,如果该字段返回1MB,则使用大小为2MB的VMO调用zx_bti_pin()将最多返回两个连续物理的空间。
  4. // 如果使用大小为2.5MB的VMO,它将最多返回三个连续物理的空间。
  5. uint64_t minimum_contiguity;
  6. // 设备地址空间中的字节数(如果字段为2^64,则为UINT64_MAX)。
  7. uint64_t aspace_size;
  8. } zx_info_bti_t;

权限

TODO(ZX-2399)

返回值

zx_object_get_info() 执行成功则返回ZX_OK。 如果发生错误,将返回以下错误码之一。

错误码

ZX_ERR_BAD_HANDLEhandle是无效句柄。

ZX_ERR_WRONG_TYPEhandle不符合topic所需要的类型

ZX_ERR_ACCESS_DENIEDhandle没有需要的操作权限。

ZX_ERR_INVALID_ARGSbufferactualavail是无效指针。

ZX_ERR_NO_MEMORY:由于内存不足导致的失败。 而用户空间无法处理这个(不太可能发生的)错误。 在将来的构建版本中,将不再出现此错误。

ZX_ERR_BUFFER_TOO_SMALL:该topic返回固定数量的记录,但提供的缓冲区不足以存放这些记录。

ZX_ERR_NOT_SUPPORTEDtopic主题不存在。

示例

  1. bool is_handle_valid(zx_handle_t handle) {
  2. return zx_object_get_info(
  3. handle, ZX_INFO_HANDLE_VALID, NULL, 0, NULL, NULL) == ZX_OK;
  4. }
  5. zx_koid_t get_object_koid(zx_handle_t handle) {
  6. zx_info_handle_basic_t info;
  7. if (zx_object_get_info(handle, ZX_INFO_HANDLE_BASIC,
  8. &info, sizeof(info), NULL, NULL) != ZX_OK) {
  9. return 0;
  10. }
  11. return info.koid;
  12. }
  13. void examine_threads(zx_handle_t proc) {
  14. zx_koid_t threads[128];
  15. size_t count, avail;
  16. if (zx_object_get_info(proc, ZX_INFO_PROCESS_THREADS, threads,
  17. sizeof(threads), &count, &avail) != ZX_OK) {
  18. // Error!
  19. } else {
  20. if (avail > count) {
  21. // More threads than space in array;
  22. // could call again with larger array.
  23. }
  24. for (size_t n = 0; n < count; n++) {
  25. do_something(thread[n]);
  26. }
  27. }
  28. }

另见

handle_close, handle_duplicate, handle_replace, object_get_child.