Linux 如何获取尽可能低的堆栈地址

问题描述 投票:0回答:1

我想在 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 下的最低堆栈地址?

c++ linux embedded-v8
1个回答
0
投票

您从

/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 或任何您的进程限制。

© www.soinside.com 2019 - 2024. All rights reserved.