众所周知,内核使用“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时内存中的指令操作)