よく知られているように、カーネルは「mcount」をプレースホルダーとして使用して、FTRACE 操作中に CPU 命令の実行をリダイレクトします。例えば:
c1003000 <run_init_process>:
c1003000: 55 push %ebp
c1003001: 89 e5 mov %esp,%ebp
c1003003: 83 ec 04 sub $0x4,%esp
c1003006: e8 21 e2 5c 00 call c15d122c <mcount>
c100300b: b9 80 4f 83 c1 mov $0xc1834f80,%ecx
c1003010: 64 8b 15 90 cf 95 c1 mov %fs:0xc195cf90,%edx
c1003017: a3 20 50 83 c1 mov %eax,0xc1835020
上記から、命令「call mcount」は、FTRACE 操作中に他の命令に動的に置き換えられます。
問題は、CPU が実行前に常に特定の数の命令をキャッシュにプリロードすることを考えると、カーネル メモリ内の命令置換がどれほど安全かということです。また、命令をロードした後、FTRACE 操作によってメモリ内の命令が置き換えられる場合があります。しかし、CPU は引き続きキャッシュされたバージョンを実行しますよね? または、FTRACE は、メモリの内容を変更した直後に CPU 命令/データ キャッシュの無効化をトリガーしますか? (カーネルソースコードのリファレンスを提供してください?)
ありがとう。
PS: 参照: http://people.redhat.com/srostedt/ftrace-tutorial.odp (スライド 36 と 37 は、関数で FTRACE が有効になっている場合のメモリ内での命令操作を示しています)