众所周知,内核使用" 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时内存中的指令操作)
答案 0 :(得分:0)
如下所述:
http://lwn.net/Articles/556186/
FTRACE正在使用“stop_machine”架构,在这种模式下,当CPU修改任务代码区的内存时,所有任务都远离其执行活动,因此CPU缓存不太可能存储要执行的代码,因此可以修改内存中的代码。