1

よく知られているように、カーネルは「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 が有効になっている場合のメモリ内での命令操作を示しています)

4

1 に答える 1

0

ここで簡単に述べたように:

http://lwn.net/Articles/556186/

FTRACE は「stop_machine」アーキテクチャを使用しており、このモードでは、CPU がタスク コード領域のメモリを変更している場合、すべてのタスクはその実行アクティビティから遠く離れているため、CPU キャッシュにコードが格納される可能性は低くなります。したがって、メモリ内のコードを変更しても問題ありません。

于 2014-06-07T02:38:27.633 に答える