我正在尝试实现内核函数拦截(替换 System.map 的函数指针,使用 this old method (c) Silvio);根据 this forum post ,一些可能的缺陷可能与指令缓存和 mp-IRQ 源有关,它们在拦截后未刷新/更新。
这些子系统是什么以及在这种情况下如何处理它们?
最佳答案
指令缓存不是 Linux 内核子系统 - 它是 CPU 的一部分。
从主内存中获取代码需要花费大量时间,因此 CPU 使用缓存内存来缓存代码段。这是指令缓存,用于保存 CPU 有理由相信很快将需要的指令(代码)的副本。
如果您更改内存中的指令(代码),如所提到的示例所做的那样,但不刷新指令缓存,您更改的代码可能会神秘地无法运行,直到某个随机时间点,其中指令缓存条目保存您替换的指令被清除。
mp-IRQ 是多处理器中断的缩写。与此相关的问题是,在 SMP(多 CPU 或多核)系统上,植入跟踪点的代码可能在一个 CPU 上运行,而另一个 CPU 正在执行它。为了安全地处理这个问题,您需要完成同步所有 CPU 的非常复杂的任务,以确保您尝试修补的代码不会因中断而在其他 CPU 上使用。
关于Linux 内核 : what are instruction cache and mp-IRQ subsystem within a terms of function interception via replace?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5222428/