【发布时间】:2010-06-26 22:47:07
【问题描述】:
我想在 Linux 上用 c 做一个简单的即时编译器。
如何分配内存,以便我可以将原始 x86 代码写入其中并将其作为任何其他函数执行?
【问题讨论】:
我想在 Linux 上用 c 做一个简单的即时编译器。
如何分配内存,以便我可以将原始 x86 代码写入其中并将其作为任何其他函数执行?
【问题讨论】:
参见 mprotect()。一旦你用代码填充了(n-)页大小的内存区域(使用 mmap() 分配),更改其权限以禁止写入并允许执行。
【讨论】:
除了正确使用mprotect 提供先写后执行权限外,在某些操作系统/硬件操作上,您可能需要刷新 I-cache。目前(2010 年中),所有最新的 x86 处理器都有用于指令和数据的单独的 1 级缓存,并且有人必须确保如果您将新指令写入内存(这将更新 D 缓存),您不会'然后尝试执行 I-cache 中的陈旧位。究竟如何从用户空间刷新 I-cache 将取决于您的硬件和操作系统。我的建议是阅读英特尔关于“自修改代码”的文档,了解他们的 IA-32 多处理器。这应该足以让您通过。
【讨论】:
jmp。不过这很好,因为其他架构没有一致的 I-cache。
__builtin___clear_cache,否则 gcc 会将存储优化为死存储。有关示例,请参见 The repetitive byte counter。