【问题标题】:data segment containing heap data or static variables包含堆数据或静态变量的数据段
【发布时间】:2021-03-11 10:43:02
【问题描述】:

我正在阅读(操作系统 - Tannenbaum,第 190 页)关于系统内存的内容,我发现一段说:

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

Data Segment 表示它用于初始化静态变量。

哪一个是正确的?还是我的理解有问题?

【问题讨论】:

  • 两者。在初始化的静态数据之后是堆。通常在堆开始之前首先跟随未初始化的静态/全局数据,因此:初始化的全局数据;未初始化的全局数据; heap .... 栈(栈向下增长,堆向上增长)。

标签: c memory memory-management operating-system


【解决方案1】:

来自您的link 本身:

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

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

从那时起,发生了一些重要的变化:

  • 没有更多的内存和更多的 CPU 位,硬件不再需要分段。
  • Segments 不仅仅是一个硬件工件 - 它们成为一种内存管理设计模式。
  • BSS 段是 introduced
  • mmap()POSIX shared memory IPC 等功能意味着堆不是单个连续段。
  • 多线程意味着多个堆栈,在同一个内存空间中,共享一个堆。

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

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

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

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

如今,堆栈是一个不同的故事。当您创建一个新线程时,它会获得一个新堆栈,通常大小有限(例如,某些版本的 Linux 上为 8 MB)。最有可能的是,线程的堆栈将从与堆相同的区域分配,这意味着位于比数据段更高的地址,并且由于堆栈增长到 地址,所有堆栈将@987654327 @。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多