【问题标题】:How does ftrace track interrupt service routines?ftrace 如何跟踪中断服务程序?
【发布时间】:2017-05-22 21:55:03
【问题描述】:

ftrace 用于内核的函数跟踪。现在它如何处理中断。它可以在中断模式下跟踪内核功能吗?如果是这样,你能解释一下它是如何工作的。我正在尝试编写一个跟踪函数调用的函数,它在 Supervisor 模式下工作正常,但在中断模式下不起作用(进入循环)。我需要让它在 IRQ 模式下工作。

【问题讨论】:

  • 当我在“*_irq_handler”上执行函数跟踪时,这是来自我的跟踪输出(x86 系统)的一行:“Xorg-1448 [000] d.h. 830819.774909: ironlake_irq_handler

标签: linux-kernel arm linux-device-driver interrupt-handling ftrace


【解决方案1】:

正如Linux kernel ARM exception stack init 的详细信息,Linux 使用的 IRQ 堆栈数量是最少的。 ARM 有几个分组寄存器,包括用于 IRQ 模式的 lrsp。在 Linux ARM 内核中,这些寄存器仅用于将信息传输到主管 (8K) 堆栈。这个监督栈是为每个内核进程分配的,还包含一个任务上下文块,其中包含指向内存管理器调度器文件系统的指针 信息。

所以在 Linux 中,supervisor stack 拥有所有模式的堆栈信息,包括 FIQ、IRQ、未定义指令、数据和指令错误。这意味着只需要跟踪一个堆栈。特殊信息(伪汇编程序)包含在entry-armv.S 中,例如UNWIND(.fnend)ENDPROC(__irq_usr),它们用ELF 信息注释内核以创建展开表,从而允许堆栈跟踪代码了解堆栈上的数据布局。

Vector page mapping in ARM Linux 有一些额外的细节,例如进行堆栈/模式切换的vector_name 汇编器宏。 vector_name 汇编器宏是唯一在 IRQ 模式下实际执行的代码。 irq_usrirq_svc 在超级用户模式下执行,带有超级用户堆栈。

【讨论】:

  • ftrace是如何从栈中打印函数名的。你能指出ftrace中打印函数名的实现部分吗(我的意思是代码)。我检查了内核源代码中的 ftrace.c 文件,但无法理解。
  • stacktrace.c 按照ARM lr and fp 使用标准偏移量进行堆栈跟踪。 unwind.c 是一个更现代的版本,是参考 PC 和表格来确定功能。
  • ftrace-design by Mike Frysinger 有更多详细信息,应该是您的内核版本的最新版本。
猜你喜欢
  • 2011-04-04
  • 2017-06-11
  • 1970-01-01
  • 2022-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多