1

ftraceは、カーネルの関数トレースに使用されます。今はどのように割り込みのために働くのですか?割り込みモードでカーネル機能を追跡できますか?そうであれば、その仕組みを説明できます。関数呼び出しを追跡する関数を記述しようとしていますが、スーパーバイザモードでは正常に動作しますが、割り込みモードでは機能しません(ループに入ります)。私はIRQモードで動作させる必要があります。ftraceはどのように割り込みサービスルーチンを追跡しますか?

+0

"* _irq_handler"で関数トレースを実行すると、これはトレース出力(x86システム)の行です。 "Xorg-1448 [000] d.h. 830819.774909:ironlake_irq_handler <-__ handle _irq_event_percpu" "h"はハードアルコンテキストであることを意味します。それはあなたの2番目の質問に答えますか?そして最初に展開していただけますか? – michaeljt

答えて

1

詳細については、Linux kernel ARM exception stack initのように、Linuxで使用されるIRQスタックの量は最小限です。 ARMには、IRQモードではlrspを含むいくつかのバンクレジスタがあります。 Linux ARMカーネルでは、これらのレジスタは、情報をスーパバイザ(8K)スタックに転送するために短時間のみ使用されます。このスーパーバイザースタックは、カーネルプロセスごとに割り当てるともメモリマネージャスケジューラファイルシステムへのポインタ情報をタスクコンテキストブロックが含まれています。

Linuxでは、スーパバイザスタックには、FIQ、IRQ、未定義命令、データ、命令フォールトを含むすべてのモードのスタック情報があります。つまり、スタックを1つだけトレースする必要があります。 UNWIND(.fnend)ENDPROC(__irq_usr)のような特別な情報(擬似アセンブラ)がentry-armv.Sに含まれています。カーネルにELF情報を付けると、スタックトレースコードがスタック上のデータのレイアウトを理解できるunwindテーブルを作成できます。

Vector page mapping in ARM Linuxには、スタック/モード​​切り替えを行うvector_nameアセンブラマクロのようないくつかの詳細があります。 vector_nameアセンブラマクロは、IRQモードで実際に実行される唯一のコードです。 irq_usrおよびirq_svcはスーパーバイザモードでスーパーバイザスタックで実行されます。

+0

ftraceはスタックから関数名をどのように出力しますか?ftraceの関数名の実装部分(私はコードを意味します)を教えてください。私はカーネルのソースでftrace.cファイルをチェックしましたが、それを理解できませんでした。 – karthikpj

+0

[stacktrace.c](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/kernel/stacktrace.c?id=refs/tags/) v4.10-rc3)は[ARM lrとfp](http://stackoverflow.com/questions/15752188/arm-link-register-and-frame-pointer/15752671#15752671)に従って標準オフセットでスタックトレースを行います。 。 [unwind.c](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/kernel/unwind.c?id=refs/tags/v4)。 10-rc3)は、機能を決定するためにPCとテーブルを参照するより現代的なバージョンです。 –

+0

Mike Frysingerの[ftrace-design](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/plain/Documentation/trace/ftrace-design.txt)に詳細と現在のカーネルバージョンでなければなりません。 –

関連する問題