10 如果CPU / OS具有“执行禁用”位,运行时生成的机器代码(例如JIT的输出)如何由CPU实际执行? 据我所知,许多现代处理器和操作系统包括用于支持NX位,(包括Intel和ARM),这防止了机器代码被存储在任何地址其它不是从正在执行的编译的二进制的代码部分。显然,这是一个不错的安全优势,因为它可以防止外壳代码注入攻击。 但是,如何动态生成机器代码的JIT引擎(如LLVM)如何解决这一问题? machine-code jit llvm — 西勒 source 看一下Memory :: allocateMappedMemory的实现,看看它如何在LLVM中完成。- 对于* nix中 - 对于Windows — ZR01
6 在Linux和许多POSIX系统,应用程序可以改变一些范围的过程中的保护的地址空间中的虚拟存储器使用MMAP(2)和mprotect的(2)的系统调用。 因此,JIT引擎可以使用它们(可能在发出机器代码之前,但是可能在发出机器代码之后)。 顺便说一句,在某些体系结构上,您可能需要将新可用的机器代码段(例如__builtin_clear_cache,GCC)通知CPU缓存。 — 巴西勒·斯塔林凯维奇 source