【问题标题】:A tiny x86_x64 JIT whiout use mmap on Linux在 Linux 上使用 mmap 的小型 x86_x64 JIT
【发布时间】:2020-07-20 04:58:48
【问题描述】:

我正在实施 JIT(用于研究),我想知道是否可以在不使用 mmap 的情况下运行操作码,因为我正在 MMAP 没有 MAP_ANONYMOUS 定义的操作系统上“播放”。

JIT 代码:

#include <stdio.h> 
#include <string.h> 
#include <sys/mman.h> 

int main () {
  // Hexadecimal x86_64 machine code for: int mul (int a, int b) { return a * b; }
  unsigned char code [] = {
    0x55,                   // push rbp
    0x48, 0x89, 0xe5,       // mov  rbp, rsp
    0x89, 0x7d, 0xfc,       // mov  DWORD PTR [rbp-0x4],edi
    0x89, 0x75, 0xf8,       // mov  DWORD PTR [rbp-0x8],esi
    0x8b, 0x75, 0xfc,       // mov  esi,DWORD PTR [rbp-04x]
    0x0f, 0xaf, 0x75, 0xf8, // imul esi,DWORD PTR [rbp-0x8]
    0x89, 0xf0,             // mov  eax,esi
    0x5d,                   // pop  rbp
    0xc3                    // ret
  };

  // allocate executable memory via sys call
  void* mem = mmap(NULL, sizeof(code), PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);

  // copy runtime code into allocated memory
  memcpy(mem, code, sizeof(code));

  // typecast allocated memory to a function pointer
  int (*func) () = mem;

  // call function pointer
  printf("%d * %d = %d\n", 5, 11, func(5, 11));

  // Free up allocated memory
  munmap(mem, sizeof(code));
}

【问题讨论】:

  • 如果包含数组的页面是可执行的。是吗?

标签: c mmap jit


【解决方案1】:

如果我没记错的话,在MAP_ANONYMOUS 发明之前,映射非文件支持内存的标准方法是打开/dev/zero 并将其映射为文件。如果你的系统有mmap,我希望它可以工作。

否则,您可以随意分配内存,并使用mprotect 使其可执行。请注意,您需要确保代码对齐并填充到页面边界,这样您就不会无意中更改程序其他部分的保护。 posix_memalign 是一个很好的方法,或者旧的valloc

【讨论】:

    猜你喜欢
    • 2013-04-29
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2012-03-05
    • 2013-12-31
    相关资源
    最近更新 更多