0

我正在尝试实现一个内核函数拦截(使用这个旧方法(c) Silvio 替换 System.map 的函数指针);根据这个论坛帖子,一些可能的缺陷可能与指令缓存和 mp-IRQ 源有关,它们在拦截后没有刷新/更新。

这些子系统是什么以及在这种情况下如何处理它们?

4

1 回答 1

2

指令缓存不是 Linux 内核子系统——它是 CPU 的一部分。

从主存中获取代码需要很长时间,因此 CPU 使用高速缓存来缓存代码段。这是保存指令(代码)副本的指令缓存,CPU 有理由相信很快就会需要这些副本。

如果您更改内存中的指令(代码),如示例所引用的那样,但不刷新指令缓存,您更改的代码可能会神秘地无法运行,直到某个随机时间点保存您替换的指令的指令缓存条目被清除。

mp-IRQ 是多处理器中断的缩写。与此上下文相关的问题是,在 SMP(多 CPU 或多核)系统上,植入跟踪点的代码可能在一个 CPU 上运行,而另一个 CPU 正在执行它。为了安全地处理这个问题,您需要执行非常复杂的同步所有 CPU 的任务,以确保您尝试修补的代码不会被中断在其他 CPU 上使用。

于 2011-03-07T19:07:52.743 回答