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分为两个阶段:
- 创建代码
- 运行代码
创建代码的工作占了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)
文件来源及推荐阅读