1. 程式人生 > >硬體堆疊和軟體堆疊

硬體堆疊和軟體堆疊

看法一: 關於硬體棧與軟體棧的看法: 一、在使用上
由 ss 與 esp 組成的棧結構已經可以算是硬體棧了,它們的 pop/push 行為都是由處理器去維護了。
軟體棧:軟體可以自己定義一個數據結構,pop/push 行為需由軟體去維護,如:棧頂和棧底、棧空和棧滿等的維護。 二、從物理上
若要從物理上去定義硬體棧結構,恐怕只有 X86 才有真正的硬體棧結構。那就是 x86 獨特的浮點暫存器堆結構:
由 FR0 ~ FR7 浮點暫存器組成的一個浮點寄存棧結構。棧指標是:x87 的 status word 暫存器中有一個 top 域來指出棧頂,也就是邏輯上 ST(0) 就是棧頂,它可以對應 FR0~FR7 任一個暫存器。x87 的這個棧結構像一個圓形的環,棧滿會自動回捲
看法二: 堆疊是一個區域,是用來存放資料的,這個區域本身沒有任何特殊之處,就是內部RAM的一部份,特殊的是它存放和取用資料的方式,即所謂的'先進後出,後進先出’,並且堆疊有特殊的資料傳輸指令,即'PUSH’和'POP’,有一個特殊的專為其服務的單元,即堆疊指標SP,每當執一次PUSH指令時,SP就(在原來值的基礎上)自動加1,每當執行一次POP指令,SP就(在原來值的基礎上)自動減1。由於SP中的值可以用指令加以改變,所以只要在程式開始階段更改了SP的值,就可以把堆疊設定在規定的記憶體單元中,如在程式開始時,用一條MOV SP,#5FH指令,就是把堆疊設定在從記憶體單元60H開始的單元中。一般程式的開頭總有這麼一條設定堆疊指標的指令,因為開機時,SP的初始值為07H,這樣就使堆疊從08H單元開始往後,而08H到1FH這個區域正是8031的第二、三、四工作暫存器區,經常要被使用,這會造成資料的混亂。不同作者編寫程式時,初始化堆疊指令也不完全相同,這是作者的習慣問題。當設定好堆疊區後,並不意味著該區域成為一種專用記憶體,它還是可以象普通記憶體區域一樣使用,只是一般情況下程式設計者不會把它當成普通記憶體用了。 常識普及:
程式計數器PC
PC用於確定下一條指令的地址,以保證程式能夠連續地執行下去,因此通常又被稱為指令地址計數器。在程式開始執行前必須將程式的第一條指令的記憶體單元地址(即程式的首地址)送入PC,使它總是指向下一條要執行指令的地址。 1.    說明“棧”和“堆”的差別. 答:棧是一塊按後進先出規則訪問的儲存區域,用來實現中斷巢狀和子程式呼叫的引數和返回斷點。        堆雖然是一塊儲存區域,但是對堆的訪問是任意的,沒有後進先出的要求,堆主要用來為動態變數分配儲存空間。
 2.   何謂系統棧? 何謂使用者棧? 系統棧有何用途? 使用者棧有何用途? 答:系統棧是記憶體中屬於作業系統空間的一塊固定區域,其主要用途為:(1)儲存中斷現場,對於巢狀中斷,被中斷程式的現場資訊依次壓入系統棧,中斷返回時逆序彈出;(2)儲存作業系統子程式間相互呼叫的引數、返回值、返回點、以及子程式的區域性變數。使用者棧是使用者程序空間中的一塊區域,用於儲存使用者程序的子程式間相互呼叫的引數、返回值、返回點、以及子程式的區域性變數。
  3.  使用者堆疊段的長度為何無法確定? 答:使用者堆疊段的長度主要取決於兩個因素:(1)使用者程序(執行緒)中子程式(函式)之間的巢狀呼叫深度;(2)子程式引數和區域性變數的數量及型別。這些在程序(執行緒)執行前無法確定,由此導致使用者堆疊段的長度無法確定。   4.   為什麼嵌入式作業系統通常採用微核心結構? 答:嵌入式作業系統與一般作業系統相比具有比較明顯的差別: (1)嵌入式作業系統規模一般較小,因為一般硬體配置較低,而且對作業系統提供的功能要求也不高。(2)應用領域差別大,對於不同的應用領域其硬體環境和裝置配置情況有明顯差別。所以,嵌入式作業系統一般採用微核心(micro kernel)結構。微核心包括如下基本成分: (1)處理機排程;(2)基本記憶體管理;(3)通訊機制;(4)電源管理。