【问题标题】:Does FTRACE invalidate the CPU instruction cache after it has modify the code instructions in memory?FTRACE在修改内存中的代码指令后是否会使CPU指令缓存失效?
【发布时间】:2014-06-01 15:26:11
【问题描述】:

众所周知,内核在 FTRACE 操作期间使用“mcount”作为占位符来重定向 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

从上面可以看出,在 FTRACE 操作期间,“call mcount”指令将被动态替换为其他指令。

问题是内核内存中的指令替换有多安全 - 假设 CPU 在执行之前总是将一定数量的指令预加载到其缓存中。并且可能会发生在加载指令后,FTRACE 操作会替换内存中的指令。但是 CPU 仍然会执行缓存的版本,对吧?还是 FTRACE 在修改内存内容后立即触发 CPU 指令/数据缓存失效? (请提供内核源代码参考?)

谢谢。

PS:参考:http://people.redhat.com/srostedt/ftrace-tutorial.odp(幻灯片 36 和 37 显示了在功能上启用 FTRACE 时内存中的指令操作)

【问题讨论】:

    标签: debugging linux-kernel ftrace


    【解决方案1】:

    这里简要提到:

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

    FTRACE 使用的是“stop_machine”架构,在这种模式下,当 CPU 修改任务代码区的内存时,所有任务都远离它的执行活动,因此 CPU 缓存不太可能存储要执行的代码,因此可以修改内存中的代码。

    【讨论】:

      猜你喜欢
      • 2020-10-06
      • 2017-11-12
      • 2018-02-10
      • 2015-01-02
      • 2018-07-04
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多