eBPFの落とし穴:Linuxカーネル6.9以降のFRED

2025-03-01

Linuxカーネル6.9以降、x86_64アーキテクチャにおいてCONFIG_X86_FRED設定オプションが導入され、タスクのカーネルスタックの底に16バイトのパディングが追加されるようになりました。これにより、カーネルスタックとpt_regs構造体に直接アクセスするeBPFプログラムが壊れ、ゴミデータが返されるようになります。著者は、カーネル6.11にアップグレードした後、自身のeBPFツールxcapture-nextでこの問題に遭遇しました。分析の結果、FREDによるスタックオフセットが原因であることが判明しました。スタックアドレス計算を調整するための動的なFRED検出メカニズムが提示されています。この問題は解決されます。この記事は、特に生のカーネルスタック操作を行うeBPF開発者にとって非常に重要です。

開発