Arch-Linux
與 Unix 作業系統上的堆棧相關的文件在哪裡?
我正在我的一台電腦上執行 Arch Linux,64 位最新更新。我目前是一名電腦科學專業的學生,昨天我們進行了一次測試,我們將使用鍊錶實現一個動態堆棧。我現在有興趣了解我的電腦中的堆棧是如何建構的,但是我在我的 Arch Linux 電腦上找不到任何帶有註釋的“stack.c”。堆棧程式在哪裡?我了解堆棧是如何創建記憶體的,但我想實際查看程式碼並自己嘗試一下。
術語“堆棧”被重載。一些可能的解釋包括:
- “堆棧”是對一組資料結構的抽象,這些資料結構提供對其包含的元素的後進先出 (LIFO) 訪問。
- 有“堆棧”抽象的實現。您在課堂上開發的基於鍊錶的堆棧就是這樣一種實現。這不是唯一的認識。例如,也可以使用數組建構堆棧。
- 執行時啟動棧——用於在程序中執行緒執行期間管理函式呼叫和返回的棧——是“棧”抽象的另一種實現。它的行為類似於基於數組的堆棧。
就(3)而言,一個“塊”記憶體被分配給程序中的每個正在執行的執行緒。當函式在這些執行緒中被呼叫並返回時,它們會從與執行緒關聯的堆棧中推送和彈出“堆棧幀”(執行時啟動堆棧上的“元素”)。堆棧幀中包含的內容的細節因硬體架構而異。通常,堆棧幀包含:
- 呼叫者的返回地址
- 函式的部分或全部參數(取決於硬體架構、參數數量及其大小)
- 函式內定義的局部變數。
- 函式使用的寄存器的狀態,但其值需要在函式返回之前恢復。
因為參數的數量、函式內局部變數的數量和大小以及需要保存的寄存器因函式而異,所以堆棧幀沒有固定大小。
無需
stack.c
檢查,因為管理啟動記錄堆棧的程式碼是由逐個函式建構程序的編譯器生成的。編譯器生成指令來觸發函式呼叫。當編譯器產生程序指令時,它知道:
- 什麼硬體指令用於觸發函式呼叫,以及該指令對堆棧有什麼影響(例如,它是否自動儲存返回地址,是否調整跟踪堆棧“頂部”的寄存器)。
- 如果呼叫中的任何參數儲存在堆棧中,則這些參數將根據堆棧的“頂部”來表示。
- 函式內局部變數的大小,以及這些變數相對於堆棧“頂部”的位置(編譯器使用它來調整跟踪堆棧“頂部”的寄存器)。
- 函式正在使用的寄存器以及何時需要保存/恢復
- 什麼硬體指令用於觸發函式呼叫的返回,以及該指令對堆棧的影響。
編譯器遵循一套完善的硬體架構規則(呼叫約定),以便由不同編譯器建構的不同部分組成的程序可以互操作。
請注意,儘管執行時啟動堆棧 (3) 是“堆棧”抽象 (1) 的實現,但除了推送/彈出記錄的概念之外,它與基於連結的實現幾乎沒有相似之處。