我想在 C++ 程序中嵌入 Google V8 (v6.8)。由于该程序使用了大量堆栈,因此我想将 V8 配置为使用整个可用堆栈。为此,我需要 V8 可以使用的最小允许堆栈地址。
uint32_t *base;
// TODO: set `base` to lowest stack address
...
v8::Isolate::CreateParams createParams;
createParams.array_buffer_allocator =
v8::ArrayBuffer::Allocator::NewDefaultAllocator();
createParams.constraints.set_stack_limit(base);
defaultIsolate = Isolate::New(createParams);
...
现在我必须确定 Linux 下
base
的值。为此,我尝试阅读/proc/self/maps
。然而,为堆栈读取的段大小始终只有 132k:
7fff03e18000-7fff03e39000 rw-p 00000000 00:00 0 [stack]
这似乎与设置的堆栈限制无关。我还尝试使用
getrlimit()
读取限制并按限制减少最高地址。但这会导致崩溃。
谁能告诉我如何才能找到 Linux 下的最低堆栈地址?
您从
/proc/self/maps
读取的地址范围具有误导性,因为主线程堆栈的内存映射会动态增长。据我了解,其他线程的堆栈不会增长。
这是一种特定于 Linux 的方法来检索堆栈的完整范围:
#define _GNU_SOURCE
/* required for _np functions */
#include <pthread.h>
int main(void)
{
pthread_attr_t attr;
void* stackaddr;
size_t stacksize;
if(pthread_getattr_np(pthread_self(), &attr))
return 1;
if(pthread_attr_getstack(&attr, &stackaddr, &stacksize))
return 1;
}
stackaddr
是最低可能的堆栈地址。由于堆栈向较低地址增长,因此这应该是堆栈限制参数的结束地址。我已经验证您可以写入该地址,并且这会将堆栈大小映射到 8 MiB 或任何您的进程限制。