gpt4 book ai didi

c - 在 Linux 上不使用 mmap 的小型 x86_x64 JIT

转载 作者:行者123 更新时间:2023-12-03 23:07:56 24 4
gpt4 key购买 nike

我正在实现 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));
}

最佳答案

如果我没记错的话,在 MAP_ANONYMOUS 发明之前,映射非文件支持内存的标准方法是打开 /dev/zero并将其映射为文件。如果您的系统有 mmap总而言之,我希望这能奏效。

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

关于c - 在 Linux 上不使用 mmap 的小型 x86_x64 JIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61089553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com