像 v8 这样的 JIT 编译器如何构建其内存(即堆栈、堆、代码和数据)?
How does a JIT compiler like v8 structure its memory (i.e. the stack, heap, code, and data)?
我正在尝试弄清楚 how Linux stores the stack,甚至是 C,因为每个进程都可以有自己的堆栈。每个图都显示了用于管理非常原始堆栈(也只有1个堆栈)的汇编指令和寄存器,所以我怀疑更高级别的系统是如何做到的(即具有多线程、进程、纤程、工作者、协程、生成器等的系统)。这就是为什么这个问题是关于 v8....
v8(在高层次上,如果有用的话可能会链接到一些相关代码)如何构建堆栈?它如何构造堆?还有代码和数据。你总是看到像 this:
这样的图表
但是 (a) 像 v8 这样的生产 JIT 系统是如何做到的? (b) 关键结构的实际实现是什么?使用了哪些数据结构?堆栈 实际上 是某种链表吗?或者它是一个数组?堆是否分解为特定大小的块的双向链表?它们是分配在物理上连续的内存块中(在 v8 中),还是它们使用 OS 特定的系统调用,如 Linux 上的 mmap
来分配内存,然后以自己的方式构建内存使用某种块架构(这是我想知道的)?还是仅仅依靠 malloc
之类的?
基本上,我对模拟生产 JIT 编译器的工作方式很感兴趣,并且卡在内存如何结构化(使用结构等)的开始部分。我不确定堆栈实际上是 链表,还是其他东西。我很想知道。
我认为这些图是谎言的原因是因为我们通常在这里处理虚拟内存,物理内存被抽象掉了。即使那样,虚拟内存也被分成小页面,这些小页面可能散落在周围或其他地方,我不知道。所以我觉得这些视觉效果是完全错误和误导的,想知道它到底是什么样子的。
How does v8 structure the stack?
就像任何其他程序一样:rbp
指向当前函数堆栈帧的底部,而 rsp
指向 "top"(尽管向下增长); push
和 pop
指令用于 write/read 从 rsp
指向 while decrementing/incrementing rsp
相应。没有数据结构,只有原始内存。
Is the heap [...] using OS-specific syscalls like mmap on Linux to allocate memory
是的。 V8 的托管堆使用 mmap
或其他操作系统上的等效方法一次分配一页。
请注意,此类图表所称的 "heap" 是 C++ 意义上的堆分配内存,而不是 VM 意义上的托管堆。有人可能会争辩说,后者只是前者的特殊 part/case,无论您使用 mmap
还是 malloc
都是一个并不重要的实现细节(可能超出某些性能差异,取决于使用模式)。
I think these diagrams are a lie is because we are usually dealing with virtual memory here
我会反其道而行之:虚拟内存是这些图(稍微简化但)大部分准确的原因。每个进程都认为它在世界上是孤立的,它在它的内存地址 space 中看不到任何其他进程(只是内核的一部分,用于与它交互)。进程看到的内存看起来确实像原始内存;只是地址不是物理地址,中间有一个转换层(由内核管理+ CPU)。
我正在尝试弄清楚 how Linux stores the stack,甚至是 C,因为每个进程都可以有自己的堆栈。每个图都显示了用于管理非常原始堆栈(也只有1个堆栈)的汇编指令和寄存器,所以我怀疑更高级别的系统是如何做到的(即具有多线程、进程、纤程、工作者、协程、生成器等的系统)。这就是为什么这个问题是关于 v8....
v8(在高层次上,如果有用的话可能会链接到一些相关代码)如何构建堆栈?它如何构造堆?还有代码和数据。你总是看到像 this:
这样的图表但是 (a) 像 v8 这样的生产 JIT 系统是如何做到的? (b) 关键结构的实际实现是什么?使用了哪些数据结构?堆栈 实际上 是某种链表吗?或者它是一个数组?堆是否分解为特定大小的块的双向链表?它们是分配在物理上连续的内存块中(在 v8 中),还是它们使用 OS 特定的系统调用,如 Linux 上的 mmap
来分配内存,然后以自己的方式构建内存使用某种块架构(这是我想知道的)?还是仅仅依靠 malloc
之类的?
基本上,我对模拟生产 JIT 编译器的工作方式很感兴趣,并且卡在内存如何结构化(使用结构等)的开始部分。我不确定堆栈实际上是 链表,还是其他东西。我很想知道。
我认为这些图是谎言的原因是因为我们通常在这里处理虚拟内存,物理内存被抽象掉了。即使那样,虚拟内存也被分成小页面,这些小页面可能散落在周围或其他地方,我不知道。所以我觉得这些视觉效果是完全错误和误导的,想知道它到底是什么样子的。
How does v8 structure the stack?
就像任何其他程序一样:rbp
指向当前函数堆栈帧的底部,而 rsp
指向 "top"(尽管向下增长); push
和 pop
指令用于 write/read 从 rsp
指向 while decrementing/incrementing rsp
相应。没有数据结构,只有原始内存。
Is the heap [...] using OS-specific syscalls like mmap on Linux to allocate memory
是的。 V8 的托管堆使用 mmap
或其他操作系统上的等效方法一次分配一页。
请注意,此类图表所称的 "heap" 是 C++ 意义上的堆分配内存,而不是 VM 意义上的托管堆。有人可能会争辩说,后者只是前者的特殊 part/case,无论您使用 mmap
还是 malloc
都是一个并不重要的实现细节(可能超出某些性能差异,取决于使用模式)。
I think these diagrams are a lie is because we are usually dealing with virtual memory here
我会反其道而行之:虚拟内存是这些图(稍微简化但)大部分准确的原因。每个进程都认为它在世界上是孤立的,它在它的内存地址 space 中看不到任何其他进程(只是内核的一部分,用于与它交互)。进程看到的内存看起来确实像原始内存;只是地址不是物理地址,中间有一个转换层(由内核管理+ CPU)。