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在修改tasks代码区的内存时,所有的tasks都远离它的执行活动,因此CPU缓存不太可能存储要被执行的代码。执行,因此可以修改内存中的代码。

于 2014-06-07T02:38:27.633 回答