我正在尝试使用跟踪内核ftrace
。我想跟踪内核中调用的函数。我能够从中捕获功能跟踪/sys/kernel/debug/tracing/trace
。但是无法理解。大部分跟踪仅具有以下调用。我期望从应用程序级别到内核级别的函数调用。
get_page_from_freelist() {
0) | next_zones_zonelist() {
0) 0.812 us | } /* next_zones_zonelist */
0) | zone_watermark_ok() {
0) | __zone_watermark_ok() {
0) 0.917 us | } /* __zone_watermark_ok */
0) 2.522 us | } /* zone_watermark_ok */
0) | _raw_spin_lock_irqsave() {
0) 0.825 us | } /* _raw_spin_lock_irqsave */
0) | __rmqueue() {
0) 0.963 us | } /* __rmqueue */
0) | get_pageblock_flags_group() {
0) 0.892 us | } /* get_pageblock_flags_group */
0) | __mod_zone_page_state() {
0) 0.833 us | } /* __mod_zone_page_state */
0) + 13.444 us | } /* get_page_from_freelist */
0) + 16.776 us | } /* __alloc_pages_nodemask */
0) | mod_zone_page_state() {
0) | __mod_zone_page_state() {
0) 0.900 us | } /* __mod_zone_page_state */
0) 2.476 us | } /* mod_zone_page_state */
0) | kmem_cache_alloc() {
0) 0.907 us | } /* kmem_cache_alloc */
0) | __phys_addr() {
内核程序类似于普通的c:一个main()程序,它调用functions(),而函数中的函数则调用其他子函数。例如:
void f1() {
f2();
f3();
}
void main() {
f1()
f4()
}
程序的调用关系将是树形结构。在此示例中,调用关系为
main() -> f1() -> f2()
-> f3()
-> f4()
ftrace工具显示了kerne的调用函数以及每个函数的花费时间。在您的ftrace结果中,它首先显示内核调用get_page_from_freelist()并花费13us。然后内核从函数__alloc_pages_nodemask返回。此功能花费16us,依此类推。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句