我想在Linux上使用c创建一个简单的即时编译器。
如何分配内存,以便我可以将原始x86代码写出来并像其他任何函数一样执行?
答案 0 :(得分:15)
参见mprotect()。使用代码填充(n-)页面大小的内存区域(使用mmap()分配)后,更改其权限以禁止写入并允许执行。
答案 1 :(得分:6)
除了正确使用mprotect
提供第一次写入然后执行权限外,在某些操作系统/硬件操作上,您可能需要刷新I-cache 。此时(2010年中),所有最近的x86处理器都有单独的1级高速缓存用于指令和数据,有人必须确保如果你将新指令写入内存(这将更新D-cache),你就不要然后尝试从I-cache执行过时的位。究竟如何从用户空间刷新I-cache将取决于您的硬件和操作系统。我的建议是阅读英特尔针对其IA-32多处理器的“自修改代码”的文档。这应该足以让你通过。