在某些系统中,进程的栈和堆是不可能发生碰撞的吗?

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

我正在阅读这个问题关于当进程的堆栈和堆相互碰撞时会发生什么。

但是,我在我的 Linux 上做了一些测试,以检查我是否可以强制碰撞!所以这就是我所做的:

  1. 使用
    gdb
    编写了以下 C 程序来检查进程地址空间的“边界”。我通过使用
    gdb
    x
    命令执行二进制搜索找到了“限制”,直到找到它无法再访问的地址。
int main(void) {
    int x;
}
  1. 我发现:
    • 进程内存的代码段(以及整个地址空间)的开头在地址
      0x555555554000
    • 堆的(初始)下限在
      0x555555579fff
    • 堆栈的上限/“顶部”在
      0x7fffff7ff000
    • 栈的下限在
      0x7fffffffefff
  2. 这在不同的过程中通常是一致的
  3. 因此,强制碰撞的内存量是堆的下限和堆栈的上限之间的差值:
    0x7fffff7ff000 - 0x555555579fff = 46912487575545
    字节,相当于 43690 GiB (!!)
  4. 强行碰撞显然是不可能的

我是对还是错?如果正确,是否有任何系统可以用来强制碰撞?如果错了,我错了什么?

值得注意的是,我在网上搜索了一段时间,询问这是否真的不可能,但我没有找到任何资源谈论这个。他们都假设有可能发生碰撞。

c memory stack heap-memory
© www.soinside.com 2019 - 2024. All rights reserved.