perfmonctl(2) - Linux man page
名称
perfmonctl - IA-64 性能监控单元接口概要
#include <syscall.h>#include <perfmon.h> long perfmonctl(int fd, int cmd, void *arg, int narg);注意:glibc 没有为该系统调用提供封装函数;请参阅“备注”部分。
描述
IA-64 特有的 perfmonctl() 系统调用提供了一个访问 PMU(性能监控单元)的接口。PMU 由 PMD(性能监控数据)寄存器和 PMC(性能监控控制)寄存器组成,用于收集硬件统计信息。perfmonctl() 将操作 cmd 应用于由 arg 指定的输入参数。参数的数量由 narg 定义。fd 参数指定要操作的 perfmon 上下文。
cmd 的支持值如下:
- PFM_CREATE_CONTEXT
perfmonctl(int fd, PFM_CREATE_CONTEXT, pfarg_context_t *ctxt, 1);
设置上下文。fd 参数被忽略。根据 ctxt 中指定的内容创建一个新的 perfmon 上下文,并在 ctxt->ctx_fd 中返回其文件描述符。
该文件描述符可以在后续对 perfmonctl() 的调用中使用,并且可以使用 read(2) 读取事件通知(类型为 pfm_msg_t)。可以使用 select(2)、poll(2) 和 epoll(7) 对文件描述符进行轮询。
可以通过对文件描述符调用 close(2) 来销毁上下文。
- PFM_WRITE_PMCS
perfmonctl(int fd, PFM_WRITE_PMCS, pfarg_reg_t *pmcs, n);
设置 PMC 寄存器。- PFM_WRITE_PMDS
perfmonctl(int fd, PFM_WRITE_PMDS, pfarg_reg_t *pmds, n);
设置 PMD 寄存器。- PFM_READ_PMDS
perfmonctl(int fd, PFM_READ_PMDS, pfarg_reg_t *pmds, n);
读取 PMD 寄存器。- PFM_START
perfmonctl(int fd, PFM_START, NULL, 0);
开始监控。- PFM_STOP
perfmonctl(int fd, PFM_STOP, NULL, 0);
停止监控。- PFM_LOAD_CONTEXT
perfmonctl(int fd, PFM_LOAD_CONTEXT, pfarg_load_t *largs, 1);
将上下文附加到线程。- PFM_UNLOAD_CONTEXT
perfmonctl(int fd, PFM_UNLOAD_CONTEXT, NULL, 0);
将上下文从线程分离。- PFM_RESTART
perfmonctl(int fd, PFM_RESTART, NULL, 0);
在收到溢出通知后重新启动监控。- PFM_GET_FEATURES
perfmonctl(int fd, PFM_GET_FEARURES, pfarg_features_t *arg, 1);
- PFM_DEBUG
perfmonctl(int fd, PFM_DEBUG, val, 0);
如果 val 非零,则启用调试模式,否则禁用。- PFM_GET_PMC_RESET_VAL
perfmonctl(int fd, PFM_GET_PMC_RESET_VAL, pfarg_reg_t * req, n);
将 PMC 寄存器重置为默认值。
返回值
performctl() 在操作成功时返回零。发生错误时,返回 -1,并且 errno 被设置为指示错误原因。版本
perfmonctl() 自 Linux 2.4 起可用。符合
perfmonctl() 是 Linux 特有的,仅在 IA-64 架构上可用。说明
Glibc 不提供此系统调用的包装器;使用 syscall(2) 调用它。参见
gprof(1)perfmon2 接口规范