ftrace
is used for function tracing of kernel. Now how does it work for interrupts. Can it track kernel functions in interrupt mode. If so can you explain how it works. I am trying to write a function that tracks function calls and it works fine in Supervisor mode but does not work in interrupt mode (goes into loop). I need to make it work in IRQ mode.
1 に答える
Linux カーネル ARM 例外スタックの初期化の詳細と同様に、 Linuxで使用される IRQ スタックの量は最小限です。ARM には、IRQ モードを含む複数のバンク レジスタがlr
あります。sp
Linux ARM カーネルでは、これらのレジスタは情報をスーパーバイザ (8K) スタックに転送するために短時間だけ使用されます。このスーパーバイザ スタックは、カーネル プロセスごとに割り当てられ、メモリ マネージャ、 スケジューラ、およびファイル システム情報へのポインタを含むタスク コンテキスト ブロックも含まれます。
そのため Linux では、スーパーバイザ スタックには、FIQ、IRQ、未定義命令、データ、および命令フォルトを含むすべてのモードのスタック情報があります。これは、1 つのスタックのみをトレースする必要があることを意味します。entry-armv.SUNWIND(.fnend)
には、およびなどの特別な情報 (疑似アセンブラー) が含まれてENDPROC(__irq_usr)
おり、ELF 情報でカーネルに注釈を付けて、スタック トレース コードがスタック上のデータのレイアウトを理解できるようにするアンワインド テーブルを作成します。
ARM Linux のベクター ページ マッピングにvector_name
は、スタック/モード切り替えを行うアセンブラー マクロなど、いくつかの追加の詳細があります。vector_name
アセンブラ マクロは、IRQ モードで実際に実行される唯一のコードです 。スーパーバイザスタックを使用して、スーパーバイザモードで実行しますirq_usr
。irq_svc