每个程序的堆栈在内存中从哪里开始?

3 memory-management

每个程序的堆栈在内存中从哪里开始?

我知道有随机地址空间选项,它将随机选择一个地址.如果禁用该选项,每个程序是否从同一地址开始?

如果我们打开两个终端并同时运行两个程序怎么办?系统是否会对两个程序的堆栈使用相同的起始地址(通过覆盖先前程序的堆栈并在上下文切换期间将当前程序的堆栈加载到同一位置)?

如果我通过调用exec()-family函数来运行程序,如下例所示; 这个程序会有不同的堆栈和"易受攻击"程序的不同堆栈吗?或者在调用程序的堆栈之上只有一个不同的堆栈框架易受攻击?

int main(int argc, char *argv[]) {
  char *buff, *ptr;
  int i;
  bsize  = atoi(argv[1]);

  if (!(buff = malloc(bsize))) {
    printf("Can't allocate memory.\n");
    exit(0);
  }
  for (i = 0; i < bsize; i+=4)
    buff[i] = '0';

  execl("/home/amulya/Desktop/CMPE209/HWs/HW2/vulnerable","vulnerable", buff, NULL);
  return(-1);
}
Run Code Online (Sandbox Code Playgroud)

Fal*_*ina 5

您需要了解虚拟内存.是的,如果操作系统没有地址空间布局随机化(ASLR),则所有程序的堆栈都可能位于相同的虚拟地址.但这并不意味着操作系统必须将上一个程序的堆栈移动到上下文切换到另一个程序,因为通过虚拟内存它只需要确保两个程序具有相同的基本VIRTUAL地址,但每个虚拟地址可以有一个不同的物理位置.(这整段完全取决于操作系统),

至于你的第二个问题,execve将当前正在运行的程序替换为要执行的程序,这包括替换当前的文本/数据段以及堆栈,因此执行的程序将不会看到前一个程序的堆栈.