理解解释器中的JIT机制

原始代码

long add4(long num) {
  return num + 4;
}

JIT代码

0x48, 0x89, 0xf8,                   // mov %rdi, %rax
0x48, 0x83, 0xc0, 0x04,             // add $4, %rax
0xc3                                // ret

执行JIT代码

由于操作系统无法在用户态中执行堆中的数据,所以使用内存映射技术。

简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映到用户空间。

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


void* alloc_executable_memory(size_t size) {
        void* ptr = mmap(0, size,
                        PROT_READ | PROT_WRITE | PROT_EXEC,
                        MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
        if (ptr == (void*)-1) {
                perror("mmap");
                return NULL;
        }
        return ptr;
}

void emit_code_into_memory(unsigned char* m) {
        unsigned char code[] = {
                0x48, 0x89, 0xf8,                   // mov %rdi, %rax
                0x48, 0x83, 0xc0, 0x04,             // add $4, %rax
                0xc3                                // ret
        };
        memcpy(m, code, sizeof(code));
}

const size_t SIZE = 1024;
typedef long (*JittedFunc)(long);

// Allocates RWX memory directly.
void run_from_rwx() {
        void* m = alloc_executable_memory(SIZE);
        emit_code_into_memory(m);

        JittedFunc func = m;
        int result = func(2);
        printf("result = %d\n", result);
}

int main()
{
        run_from_rwx();
        return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值