adrp x1, ftrace_graph_entry // || (ftrace_graph_entry adrp x0, ftrace_graph_entry_stub // != ftrace_graph_entry_stub)) ldr x2, [x1, #:lo12:ftrace_graph_entry] add x0, x0, #:lo12:ftrace_graph_entry_stub cmp x0, x2 b.ne ftrace_graph_caller // ftrace_graph_caller(); m...
然而,随着对性能的需求增加和跟踪功能的增强,ftrace开始使用-mfentry来替代-pg,这是因为-mfentry提供了更低的性能开销。 转向-mfentry的原因 更低的性能开销:-mfentry插入的call _fentry__指令比call mcount更轻量,因此可以减少函数调用的性能开销。 更高效的实现:_fentry__的实现被优化用于内核环境,允许更高效...
2.1.1 静态插桩 我们来看看ARM64如何处理的,其代码路径为arch/arm64/kernel/entry-ftrace.S 当未选中CONFIG_DYNAMIC_FTRACE时,其采用如下的方案 每个函数调用都会根据不同的体系结构的实现调用_mcount函数 如果ftrace使能了某些跟踪器,ftrace_trace_function指针不再指向ftrace_stub,而是指向具体的跟踪函数 否则就执行...
cmp x0, x2//if ((ftrace_graph_returnb.ne ftrace_graph_caller//!= ftrace_stub)adrp x1, ftrace_graph_entry//|| (ftrace_graph_entryadrp x0, ftrace_graph_entry_stub//!= ftrace_graph_entry_stub))ldr x2, [x1, #:lo12:ftrace_graph_entry] add x0, x0, #:lo12:ftrace_graph_entry_...
* - ftrace_graph_caller to set up an exit hook */ENTRY(_mcount) mcount_enter adrp x0, ftrace_trace_function ldr x2, [x0, #:lo12:ftrace_trace_function] adr x0, ftrace_stub cmp x0, x2 // if (ftrace_trace_function b.eq skip_ftrace_call // != ftrace_stub) { mcount_get_...
(1) Function tracer 和 Function graph tracer: 跟踪函数调用。 (2) Schedule switch tracer: 跟踪进程调度情况。 (3) Wakeup tracer:跟踪进程的调度延迟,即高优先级进程从进入 ready 状态到获得 CPU 的延迟时间。该 tracer 只针对实时进程。 (4) Irqsoff tracer:当中断被禁止时,系统无法相应外部事件,比如键盘...
if (gops == &fgraph_stub) continue; - if (gops->entryfunc(&trace, gops)) + if (ftrace_ops_test(&gops->ops, func, NULL) && + gops->entryfunc(&trace, gops)) bitmap |= BIT(i); } @@ -402,6 +403,46 @@ int function_graph_enter(unsigned long ret, unsigned long ...
其具体的实现在相应 arch 的汇编代码中,以 x86 为例,在 entry_32.s 中: 清单4. entry_32.s ENTRY(ftrace_caller) cmpl $0, function_trace_stop jne ftrace_stub pushl %eax pushl %ecx pushl %edx movl 0xc(%esp), %eax movl 0x4(%ebp), %edx subl $MCOUNT_INSN_SIZE, %eax .globl ftrace_...
我们来看看ARM64如何处理的,其代码路径为arch/arm64/kernel/entry-ftrace.S 当未选中CONFIG_DYNAMIC_FTRACE时,其采用如下的方案 每个函数调用都会根据不同的体系结构的实现调用_mcount函数 如果ftrace使能了某些跟踪器,ftrace_trace_function指针不再指向ftrace_stub,而是指向具体的跟踪函数 ...
function_graph 跟踪器则可以提供类似 C 代码的函数调用关系信息。通过写文件 set_graph_function 可以显示指定要生成调用关系的函数,缺省会对所有可跟踪的内核函数生成函数调用关系图。清单 2 给出了使用 function_grapch 跟踪器的示例,示例中将内核函数 __do_fault 作为观察对象,该函数在内核运作过程中会被频繁调用...