我知道程序断点是Linux操作系统为一个进程分配的最高虚拟内存地址,因此标记了堆的最高地址。您可以通过调用sbrk( 0 )来获取程序断点的地址。
当我创建以下简单的程序时,每次运行时都会得到不同的结果:
例如,在我的电脑上:
我的理解是堆在虚拟内存中紧接着BSS段之上分配 - 我猜我期望它对于像这样的简单程序总是有相同的初始值。程序断点最初的位置是否存在某种随机化或其他因素?如果没有,为什么每次运行程序都不同?
当我创建以下简单的程序时,每次运行时都会得到不同的结果:
#define _BSD_SOURCE
#include <stdio.h>
#include <unistd.h>
int main()
{
printf( "system break: %p\n", sbrk( 0 ) );
return 0;
}
例如,在我的电脑上:
$ ./sbrk
system break: 0x81fc000
$ ./sbrk
system break: 0x9bce000
$ ./sbrk
system break: 0x97a6000
我的理解是堆在虚拟内存中紧接着BSS段之上分配 - 我猜我期望它对于像这样的简单程序总是有相同的初始值。程序断点最初的位置是否存在某种随机化或其他因素?如果没有,为什么每次运行程序都不同?