轉)怎樣理解作業系統中「棧」的概念

2021-09-01 07:11:32 字數 2002 閱讀 7523

從cpu角度來說的棧指的是cpu有個積存器ss,這個暫存器的低16 bit連同esp一同指向下一次堆疊操作(push和pop)所要使用的堆疊位址。這個暫存器也可以被裝入任意數值,你可以通過入棧和出棧操作來給他賦值,不過由於堆疊對於很多操作有很重要的意義,因此,不正確的修改有可能造成對堆疊的破壞。

/從記憶體來說:(如下圖)

作業系統**

系統dll

記憶體對映檔案

使用者dll

記憶體分配堆

程序堆疊

全域性資料區

程序**

dos/win16

相容區域

空指標區域

(說明):

從記憶體管理角度看,堆疊是就是一塊連續的記憶體空間,對它的操作採用先入後出的規則,他的生長方向與記憶體的生長方向正好相反,也就是說它是從高位址向低位址生長.從win32程式內部的角度看,每乙個執行緒有自己的堆疊,它主要用來給執行緒提供乙個暫時存放資料的區域,程式使用pop/push指令來對堆疊進行操作.

堆疊裡面都放什麼東西:

堆疊中存放的資訊包括:當前正在執行的函式的區域性變數,函式返回位址,該函式的上層函式傳給該函式的引數,ebp的值,一些通用暫存器(edi,esi…)的值,注意這裡提到的正在執行的函式,比如有下面的一段c**:

void b()

void a()

那麼當程式執行到b函式的printf函式的時候我們說正在執行的函式包括a和b而不僅僅是b函式,這一點需要注意.

堆疊是什麼時候建立起來的,大小是多少?

#pragma comment(linker,"/stack:2048,1024" // 預約(reserve)2m,提交(commit)1m

堆疊預設為1m,當我門的程式超過了1m怎麼辦?

系統通過使用異常捕獲(exception handling)機制來捕獲應用程式企圖去訪問超過該程式提交(commit)的堆疊範圍這種異常,假如你程式預約了2m並且提交了1m大小的堆疊,那麼當你的程式企圖訪問超過1m的範圍的時候會產生乙個異常並且被系統捕獲,系統會幫你繼續從另外1m預約的記憶體中提交記憶體來滿足你的需求,如果你要求提交的大小甚至超過了2m(你一開始預約的大小)在 nt系統下(98除外)系統也會嘗試去分配(allocate)記憶體來滿足你,但是系統並不保證分配會成功

什麼叫stack frame?

stack frame這個詞你可以在各種各樣的彙編書籍中看到,到底它表示什麼意思呢?也許你看完文章的後半部分就會明白,在此我們先給它乙個定義,你看完我下面的例子就會知道它的確切含義了,stack frame是堆疊中的一塊區域,它儲存著乙個函式的返回位址,和該函式內部使用的區域性資料(local data),它是由函式入口處的sub esp,48h之類的語句來建立的.

在一次函式呼叫過程中,堆疊是如何操作的????

假設我們的主角叫a函式…

a.首先上級函式傳給a函式的引數被壓入堆疊中(至於是誰來做這個壓棧操作取決於a函式的呼叫方式:是__stdcall, __cdecl還是其他);

b.然後是返回位址(a函式執行完後接下來程式繼續執行的位址)入棧;

c.接下來是當前的ebp;

d.如果a函式有區域性變數,就在堆疊中開闢相應的空間以構造那些變數變數(a函式執行結束,這些區域性變數的內容將被忽略/遺棄,但是不被清除,比如a函式中有乙個變數int m存在於位址0x0012ffcc處,函式結束時9依然存在於0x0012ffcc處沒有被清除,但是此時它已經沒有任何意義了,

e.在函式返回的時候,彈出ebp,恢復堆疊到函式呼叫前的位址,彈出返回位址到eip以繼續執行程式。

呼叫約定

在win32中,有關函式的呼叫主要有兩種約定。

1._stdcall

以__stdcall方式呼叫的函式有以下特徵:

• 引數由右至左壓棧

• 呼叫返回時,堆疊由被調函式調整

2.__cdecl

__cdecl約定是c/c++函式的預設呼叫約定。它有以下特徵:

• 引數由右至左壓棧

• 呼叫返回時,堆疊由呼叫者調整

/從資料結構角度來說,棧只是一種演算法,先進後出。

以上說法都是針對win平台。

作業系統 作業系統的概念

3 作業系統的目標和功能 作業系統用做擴充機器 計算機系統自上而下可區分為 從作業系統的角度 計算機系統的概述 在計算機中的cpu 記憶體 輸入 輸出裝置等硬體,提供了基本的計算機資源 應用程式等規定了按何種方式來使用這些資源來為使用者服務 作業系統控制和協調各使用者程式對硬體的分配和呼叫。所以作業...

作業系統中程序概念的理解

作業系統中程序概念的理解 提 起程序這個概念,讓很多經常使用計算機的人感到陌生,其實我們經常和它打交道,只要在計算機上執行乙個程式,相應的乙個程序就誕生了,而且它伴隨著整個操 作過程,直到程式終止。程序在作業系統中是乙個非常抽象 非常重要 非常難以理解的概念。對程序概念的深入透徹的理解,有助於理解作...

作業系統相關概念的通俗理解

將一台計算機看作乙個ktv娛樂中心,每乙個ktv包房看作乙個cpu。現在只考慮單cpu也就是只有乙個ktv包房的情況。現在有很多客戶想到包房裡面k歌,每乙個客戶可以看作乙個程序。資源有限,所以必須有乙個排隊 排程機制,誰先唱歌誰後唱歌,怎麼切換。ktv的管家,也可就是作業系統,由它來完成排程。當客人...