在 Linux 上不使用 mmap 的小型 x86_x64 JIT
A tiny x86_x64 JIT whiout use mmap on Linux
我正在实施 JIT(用于研究)并且我想知道是否可以 运行 操作码而不使用 mmap,因为我 'playing' 在 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));
}
如果我没记错的话,在 MAP_ANONYMOUS
发明之前,映射非文件支持内存的标准方法是打开 /dev/zero
并将其像文件一样映射。如果你的系统有 mmap
,我希望它能工作。
否则,您可以随意分配内存,并使用mprotect
使其可执行。请注意,您需要确保您的代码对齐并填充到页面边界,这样您就不会无意中更改程序其他部分的保护。 posix_memalign
是一个很好的方法,或者旧的 valloc
.
我正在实施 JIT(用于研究)并且我想知道是否可以 运行 操作码而不使用 mmap,因为我 'playing' 在 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));
}
如果我没记错的话,在 MAP_ANONYMOUS
发明之前,映射非文件支持内存的标准方法是打开 /dev/zero
并将其像文件一样映射。如果你的系统有 mmap
,我希望它能工作。
否则,您可以随意分配内存,并使用mprotect
使其可执行。请注意,您需要确保您的代码对齐并填充到页面边界,这样您就不会无意中更改程序其他部分的保护。 posix_memalign
是一个很好的方法,或者旧的 valloc
.