【问题标题】:Allocate executable ram in c on linux在linux上的c中分配可执行ram
【发布时间】:2010-06-26 22:47:07
【问题描述】:

我想在 Linux 上用 c 做一个简单的即时编译器。

如何分配内存,以便我可以将原始 x86 代码写入其中并将其作为任何其他函数执行?

【问题讨论】:

    标签: c linux malloc


    【解决方案1】:

    参见 mprotect()。一旦你用代码填充了(n-)页大小的内存区域(使用 mmap() 分配),更改其权限以禁止写入并允许执行。

    【讨论】:

    【解决方案2】:

    除了正确使用mprotect 提供先写后执行权限外,在某些操作系统/硬件操作上,您可能需要刷新 I-cache。目前(2010 年中),所有最新的 x86 处理器都有用于指令和数据的单独的 1 级缓存,并且有人必须确保如果您将新指令写入内存(这将更新 D 缓存),您不会'然后尝试执行 I-cache 中的陈旧位。究竟如何从用户空间刷新 I-cache 将取决于您的硬件和操作系统。我的建议是阅读英特尔关于“自修改代码”的文档,了解他们的 IA-32 多处理器。这应该足以让您通过。

    【讨论】:

    • x86 不需要这个; x86 ISA 规则要求 I-cache 与数据缓存一致,并且在“看到”新写入的字节之前最多需要 jmp。不过这很好,因为其他架构没有一致的 I-cache。
    • 但有趣的事实是,如果存储到缓冲区然后将其转换为函数指针,您仍然需要 gcc 在 x86 上的 __builtin___clear_cache,否则 gcc 会将存储优化为死存储。有关示例,请参见 The repetitive byte counter
    猜你喜欢
    • 1970-01-01
    • 2018-09-26
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2011-01-28
    • 2021-02-14
    • 1970-01-01
    相关资源
    最近更新 更多