Unix 操作系统上与堆栈相关的文件在哪里?

lin*_*ker 0 c arch-linux linux-kernel stack

我在我的一台计算机上运行 Arch Linux,64 位最新更新。我目前是一名计算机科学专业的学生,​​昨天我们进行了一项测试,我们将使用链表实现动态堆栈。我现在有兴趣了解我的计算机中的堆栈是如何构建的,但是我无法在我的 Arch Linux 计算机上找到任何带有注释的“stack.c”。堆栈编程位于何处?我了解堆栈如何创建内存,但我想实际查看代码并可能自己玩弄它。

And*_*ton 6

术语“堆栈”被重载了。一些可能的解释包括:

  1. “堆栈”是对一组数据结构的抽象,这些数据结构提供对其包含的元素的后进先出 (LIFO) 访问。
  2. 变现“堆栈”的抽象。您在课堂上开发的基于链表的堆栈就是这样一种实现。这不是唯一的认识。例如,也可以使用数组构建堆栈。
  3. 运行时激活堆栈——用于在程序中的线程执行期间管理函数调用和返回的堆栈——是“堆栈”抽象的另一种实现。它的行为类似于基于数组的堆栈。

在 (3) 方面,为程序中的每个正在运行的线程分配了一块“内存”。当函数在这些线程中被调用和返回时,它们从与线程关联的堆栈中推入和弹出“堆栈帧”(运行时激活堆栈上的“元素”)。堆栈帧中包含的内容的细节因硬件架构而异。通常,堆栈帧包含:

  • 调用者的返回地址
  • 函数的部分或全部参数(取决于硬件架构、参数数量及其大小)
  • 函数内定义的局部变量。
  • 函数使用的寄存器的状态,但在函数返回之前需要恢复其值。

由于参数的数量、函数内局部变量的数量和大小以及需要保存的寄存器因函数而异,因此堆栈帧没有固定大小。

无需stack.c检查,因为管理活动记录堆栈的代码是由逐个函数构建程序的编译器生成的。编译器生成触发函数调用的指令。当编译器生成程序指令时,它知道:

  • 什么硬件指令用于触发函数调用,以及该指令对堆栈有什么影响(例如,它是否自动存储返回地址,是否调整跟踪堆栈“顶部”的寄存器)。
  • 如果调用中的任何参数存储在堆栈中,则这些参数将位于堆栈的“顶部”。
  • 函数内局部变量的大小,以及这些变量相对于堆栈“顶部”的位置(编译器使用它来调整跟踪堆栈“顶部”的寄存器)。
  • 函数正在使用的寄存器以及何时需要保存/恢复
  • 什么硬件指令用于触发函数调用的返回,以及该指令对堆栈的影响。

编译器遵循一套完善的硬件架构规则(调用约定),以便由不同编译器构建的不同部分组成的程序可以互操作。

请注意,虽然运行时激活堆栈 (3) 是“堆栈”抽象 (1) 的实现,但除了推送/弹出记录的概念外,它与基于链接的实现几乎没有相似之处。