【发布时间】: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