在修改内存中的代码指令后,FTRACE是否使CPU指令缓存无效?

时间:2014-06-01 15:26:12

标签: debugging linux-kernel ftrace

众所周知,内核使用" 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

从上面开始,指令&#34;调用mcount&#34;将在FTRACE操作期间用其他指令动态替换。

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

感谢。

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

1 个答案:

答案 0 :(得分:0)

如下所述:

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

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