ftrace
用于内核的函数跟踪。现在它如何用于中断。它能否在中断模式下跟踪内核函数。如果是这样,你能解释它是如何工作的。我正在尝试编写一个跟踪函数调用的函数,它在 Supervisor 模式下工作正常但在中断模式下不起作用(进入循环)。我需要让它在 IRQ 模式下工作。
答案 0 :(得分:1)
与Linux kernel ARM exception stack init详细信息一样,Linux使用的IRQ堆栈数量很少。 ARM有几个存储寄存器,包括lr
和sp
用于IRQ模式。在Linux ARM内核中,这些寄存器仅用于简单地将信息传输到管理程序(8K)堆栈。此管理程序堆栈按内核进程分配,还包含任务上下文块,其中包含指向内存管理器,调度程序和文件系统的指针信息。
因此在Linux中,管理程序堆栈具有所有模式的堆栈信息,包括FIQ,IRQ,未定义指令,数据和指令错误。这意味着只需要跟踪一个堆栈。特殊信息(伪汇编程序)包含在entry-armv.S中,例如UNWIND(.fnend)
和ENDPROC(__irq_usr)
,它使用ELF信息注释内核以创建允许堆栈跟踪代码理解布局的展开表。堆栈上的数据。
Vector page mapping in ARM Linux有一些额外的细节,例如进行堆栈/模式切换的vector_name
汇编程序宏。 vector_name
汇编程序宏是唯一在IRQ模式下实际执行的代码。 irq_usr
和irq_svc
使用管理程序堆栈以管理员模式执行。