首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >包含堆数据或静态变量的数据段

包含堆数据或静态变量的数据段
EN

Stack Overflow用户
提问于 2020-11-28 23:18:44
回答 1查看 129关注 0票数 0

我正在阅读(操作系统- Tannenbaum,第190页)有关系统内存的内容,我找到了一段内容如下:

数据段用作动态分配和释放的变量的堆,以及用于普通局部变量和返回地址的堆栈段。

正如数据段所说,它用于初始化静态变量。

哪一个是对的?还是我的理解出了什么问题?

EN

回答 1

Stack Overflow用户

发布于 2020-12-02 01:59:01

来自您的链接本身:

从历史上看,为了能够支持大于内部地址寄存器的本地大小的内存地址空间,早期CPU实现了一个分段系统,它们将存储一小组索引作为对某些区域的偏移。Intel 8086系列CPU提供了四个部分:代码段、数据段、堆栈段和额外段

现在,操作系统:设计和实现是写于1987年,当数据段同时用于堆栈、堆、初始化数据和未初始化数据时。

自那时以来,发生了一些重要的变化:

  • 没有更多的内存和更多的CPU位,而分割不再是硬件所需要的。
  • 段,因为不仅仅是一个硬件工件--它们成为了内存管理设计模式。
  • BSS段为介绍
  • mmap()POSIX共享内存IPC这样的特性意味着堆不是一个连续的段。
  • 多线程意味着在同一个内存空间中共享一个堆的多个堆栈.

所以写书时,“数据段”是硬件定义的概念,它包含所有非本地的内容:初始化的数据、未初始化的数据、动态分配的数据等等。

但是现在OS的内存管理器将“数据段”定义为“包含程序初始化数据的内存区域”。

在使用数据段指针的CPU上,它指向OS的内存管理器声明的“数据段”的开头。

但是内存管理器有更多的段,用于BSS和堆,它们不是由CPU指针表示的,所以内存管理器只是将它们放在数据段之后。

现在的情况不一样了。当您创建一个新线程时,它会得到一个新的堆栈,它的大小通常是有限的(例如,在某些版本的Linux上是8MB)。最有可能的是,线程的堆栈将从与堆相同的区域分配,这意味着在比数据段更高的地址上,并且由于堆栈增长到较低的地址,所有堆栈都将仍在向数据段增长

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65057838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文