我正在阅读(操作系统- Tannenbaum,第190页)有关系统内存的内容,我找到了一段内容如下:
数据段用作动态分配和释放的变量的堆,以及用于普通局部变量和返回地址的堆栈段。
正如数据段所说,它用于初始化静态变量。
哪一个是对的?还是我的理解出了什么问题?
发布于 2020-12-02 01:59:01
来自您的链接本身:
从历史上看,为了能够支持大于内部地址寄存器的本地大小的内存地址空间,早期CPU实现了一个分段系统,它们将存储一小组索引作为对某些区域的偏移。Intel 8086系列CPU提供了四个部分:代码段、数据段、堆栈段和额外段。
现在,操作系统:设计和实现是写于1987年,当数据段同时用于堆栈、堆、初始化数据和未初始化数据时。
自那时以来,发生了一些重要的变化:
mmap()
和POSIX共享内存IPC这样的特性意味着堆不是一个连续的段。所以写书时,“数据段”是硬件定义的概念,它包含所有非本地的内容:初始化的数据、未初始化的数据、动态分配的数据等等。
但是现在OS的内存管理器将“数据段”定义为“包含程序初始化数据的内存区域”。
在使用数据段指针的CPU上,它指向OS的内存管理器声明的“数据段”的开头。
但是内存管理器有更多的段,用于BSS和堆,它们不是由CPU指针表示的,所以内存管理器只是将它们放在数据段之后。
现在的情况不一样了。当您创建一个新线程时,它会得到一个新的堆栈,它的大小通常是有限的(例如,在某些版本的Linux上是8MB)。最有可能的是,线程的堆栈将从与堆相同的区域分配,这意味着在比数据段更高的地址上,并且由于堆栈增长到较低的地址,所有堆栈都将仍在向数据段增长。
https://stackoverflow.com/questions/65057838
复制相似问题