BSS,堆栈,堆,数据,代码/文本 - 其中每个都在内存中开始?

aks*_*aks 7 memory memory-management

内存段 - BSS,堆栈,堆,数据,代码/文本(还有吗?).

假设我有128MB RAM,有人可以告诉我:

  • 为每个内存段分配了多少内存?

  • 他们从哪里开始?请详细说明地址范围或类似内容.

  • 哪些因素影响应该从哪里开始?

t0m*_*13b 5

该问题取决于使用的变量数量.既然你没有指定什么编译器或语言甚至操作系统,那就很难确定了!这一切都取决于负责应用程序内存管理的操作系统.简而言之,这个问题没有明确的答案,想想这个,运行时的编译器/链接器,请求操作系统分配一块内存,该分配取决于它们有多少变量,它们有多大,变量的范围和用法.例如,这个简单的C程序,在一个名为的文件中simpletest.c:

#include <stdio.h>
int main(int argc, char **argv){
   int num = 42;
   printf("The number is %d!\n", num);
   return 0;
}

假设环境是基于Unix/Linux的,并且编译如下:

gcc -o simpletest simpletest.c

如果您要在二进制映像上发出objdump或,您将看到可执行文件的各个部分,在本例中为"bss","text".记下这些部分的大小,现在添加一个上面的代码,重新编译并重新发布或者,你会发现该部分已经出现 - 为什么?因为我们添加了一个int类型的变量,包含100个元素.nmsimpletestint var[100];objdumpnmdata

这个简单的练习将证明这些部分增长,因此二进制文件变得更大,并且它还将证明你无法预先确定将分配多少内存,因为运行时实现因编译器和操作系统以及操作系统而异.

简而言之,操作系统调用了内存管理的镜头!