1

为了在内核模块中写入只读内存位置(这种内存位置的示例是 sys_call 表),通过操作 CR0 寄存器的第 16 位来禁用页面保护是否足够?
还是我们需要更多的东西来写入只读内存位置?

4

1 回答 1

0

如果您禁用页面写保护,您可能会破坏依赖它的某些内容(例如,内核页面上发生的任何写时复制)。如果你这样做,你可能想暂时禁用中断/调度,所以内存修改在那个 CPU 上看起来是原子的,如果你有超过 1 个,这也可以避免将线程移动到不同的 CPU。

我不确定使用像 0xc12c9e90 这样的硬编码地址是个好主意。我不知道 Linux 如何在地址空间的内核部分中布置东西,但是由于动态内存分配或出于安全原因,地址可能会从一个引导更改为另一个引导(移动东西是有用的,因为它减少了机会利用内核错误)。

于 2013-01-31T06:12:32.227 回答