Introduction to JIT

JIT原理介绍。(转载)

什么是JIT

JIT,”Just In Time”的缩写,但是它究竟是什么意思呢?

Whenever a program, while running,
creates and runs some new executable code
which was not part of the program when it was stored on disk,
it’s a JIT.

一句话:

JIT就是在运行时动态创建并运行代码。

所以,JIT分为两个阶段:

  1. 创建代码
  2. 运行代码

创建代码的工作占了JIT的绝大部分,但是这部分比较好理解,编译器就是干这个的,如
gcc, llvm,都有生产代码的模块可供运行时调用。

运行代码,这部分不好理解,毕竟创建的代码是要经过OS同意才能运行的,并不是谁都
可以随随便便就能运行代码。OS运行任何应用都可以自由的创建数据,但是却禁止随意
运行代码。如何才能运行呢?使用mmap

一个简单的实例

比如我们要创建这样一段代码的机器码并运行,

1
2
3
long add4(long num) {
return num + 4;
}

下面是我们的JIT实现,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 分配内存空间
void* alloc_writable_memory(size_t size) {
void* ptr = mmap(0, size,
PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (ptr == (void*)-1) {
perror("mmap");
return NULL;
}
return ptr;
}

// 设置执行权限
int make_memory_executable(void* m, size_t size) {
if (mprotect(m, size, PROT_READ | PROT_EXEC) == -1) {
perror("mprotect");
return -1;
}
return 0;
}

// 主程序
void emit_to_rw_run_from_rx() {
void* m = alloc_writable_memory(SIZE);
emit_code_into_memory(m);
make_memory_executable(m, SIZE);

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

(over)

文件来源及推荐阅读