cmd_record是perf用户层的一个核心工具,为之后的report, annotate等工具提供profile,监测数据都记录在perf.data中,后面就是进行上层分析,这里对cmd_record()的分析主要是关注perf.data文件内容组成。
parse_events()会根据用户在命令行上的指定来配置监测事件,为每一个事件分配一个perf_evsel结构体,其中记录了事件名称与配置,最后将这个perf_evsel挂在静态全局变量evsel_list的entries链表上。对于每个事件,如果监测x个线程在y个core上运行的信息,就要做x*y个文件描述符,分别对应这个xy个监测信息,所以evsel->fd是xyarray这样类似二维数组结构,讲每个事件的名称、配置记录在perf_trace_event_type events[event_count]数组中,其中event->event_id = evesel->attr.config。
在完成用户指定事件相关操作之后,下面进入__cmd_record()。perf_session_new()函数是关键,它会被record和report分别以写、读方式进行调用,对于record在其中会调用perf_session__create_kernel_maps():(perf_session => machine)
1. 先做一个动态共享目标dso *kernel,kernel->short_name = "[kernel]", kernel->long_name = "[kernel.kallsyms]", kernel->kernel = DSO_TYPE_KERNEL, 读/sys/kernel/notes,将其中的id写入kernel->build_id[20]数组中。最后把这个dso挂到machine->kernel_dsos链表中。<=machine__create_kernel()
2. 从