天天看點

作業系統–前言03--程式執行過程

程式執行過程

當 CPU 執行程式的時候:

  1. cpu讀取PC指針指向的指令,将他導入指令寄存器.PC(Program Counter)程式計數器,也是一種寄存器。
  • CPU 的控制單元操作位址總線指定需要通路的記憶體位址
  • CPU 通知記憶體裝置準備資料
  • CPU收到記憶體傳來的資料後,将這個資料存入指令寄存器

    完成以上 3 步,CPU 成功讀取了 PC 指針指向指令,存入了指令寄存器。

2.CPU分析指令寄存器中的内容,并分析指令的類型和參數.

3.如果是計算機類型指令,就交給邏輯單元計算;如果是存儲類型的指令,難就由控制單元執行.

4.PC指針自增,并準備擷取在一條指令

如果是32位的機器上,指令就是32個bit(4 byte) ,需要4個記憶體位址,是以自增4指令的執行速度:通過石英晶體的脈沖轉化成時鐘信号驅動的,每次高低電平的轉換就是一個周期。我們稱為時鐘周期。

作業系統–前言03--程式執行過程
  • 記憶體雖然是一個随機存取器,通常不會把指令和資料存在一起,這是為了安全起見。
  • 程式指針也是一個寄存器,64 位的 CPU 會提供 64 位的寄存器,這樣就可以使用更多記憶體位址。特别要說明的是,64 位的寄存器可以尋址的範圍非常大,但是也會受到位址總線條數的限制。比如和 64 位 CPU 配套工作的位址總線隻有 40 條,那麼可以尋址的範圍就隻有 1T,也就是 2^40。
  • 從 PC 指針讀取指令、到執行、再到下一條指令,構成了一個循環,這個不斷循環的過程叫作CPU 的指令周期,

a=11+15的CPU執行過程:

1.編譯器通過分析,發現 11 和 15 是資料,是以編譯好的程式啟動時,會在記憶體中開辟出一個專門的區域存這樣的常數,這個專門用來存儲常數的區域,就是資料段,如下圖所示:

  • 11 被存儲到了位址 0x100;
  • 15 被存儲到了位址 0x104;
作業系統–前言03--程式執行過程

2.編譯器将a=11+15轉換成了 4 條指令,程式啟動後,這些指令被導入了一個專門用來存儲指令的區域,也就是正文段。如上圖所示,這 4 條指令被存儲到了 0x200-0x20c 的區域中:

  • 0x200 位置的 load 指令将位址 0x100 中的資料 11 導入寄存器 R0;
  • 0x204 位置的 load 指令将位址 0x104 中的資料 15 導入寄存器 R1;
  • 0x208 位置的 add 指令将寄存器 R0 和 R1 中的值相加,存入寄存器 R2;
  • 0x20c 位置的 store 指令将寄存器 R2 中的值存回資料區域中的 0x1108 位置。

3.具體執行的時候,PC 指針先指向 0x200 位置,然後依次執行這 4 條指令。

  • 變量 a 實際上是記憶體中的一個位址,a 是給程式員的辨別符。
  • 每次操作 4 個位址,也就是 32 位,這是因為在用 32 位寬的 CPU 舉例。在 32 位寬的 CPU 中,指令也是 32 位的。但是資料可以小于 32 位,比如可以加和兩個 8 位的位元組。

指令

構造指令的過程,叫作指令的編碼,通常由編譯器完成;解析指令的過程,叫作指令的解碼,由 CPU 完成。由此可見 CPU 内部有一個循環:

  • 首先 CPU 通過 PC 指針讀取對應記憶體位址的指令,叫作 Fetch,就是擷取的意思。
  • CPU 對指令進行解碼,叫作 Decode。
  • CPU 執行指令,我們将這個部分,叫作 Execution。
  • CPU 将結果存回寄存器或者将寄存器存入記憶體, Store。
作業系統–前言03--程式執行過程

上面 4 個步驟,我們叫作 CPU 的指令周期。CPU 的工作就是一個周期接着一個周期,周而複始。

指令的類型

不同類型(不同 OpCode)的指令、參數個數、每個參數的位寬,都不一樣。而參數可以是以下這三種類型:

  • 寄存器
  • 記憶體位址
  • 數值(一般是整數和浮點)

論是寄存器、記憶體位址還是數值,它們都是數字。

指令從功能角度來劃分,大概有以下 5 類:

  1. I/O 類型的指令,比如處理和記憶體間資料交換的指令 store/load 等;。
  2. 計算機類型指令,最多處理兩個寄存器,加減法,位運算,比較大小等
  3. 跳轉類型指令,用處就是修改PC指針,比如程式設計中大家經常遇到需要條件判斷+跳轉的邏輯,比如 if-else,swtich-case、函數調用等.
  4. **信号類型的指令,**比如發送中斷的指令trap;
  5. 閑置CPU的指令NUP,一般 CPU 都有這樣一條指令,執行後 CPU 會空轉一個周期。

指令還有一個分法,就是尋址模式,比如同樣是求和指令,可能會有 2 個版本:

  1. 将兩個寄存器的值相加的 add 指令。
  2. 将一個寄存器和一個整數相加的 addi 指令。

加載記憶體中的資料到寄存器的 load 指令也有不同的尋址模式:

  1. 直接尋址:直接加載一個記憶體位址中的資料到寄存器的指令la.
  2. 寄存器尋址:直接将一個數值導入寄存器的指令LI.
  3. **間接尋址:**将一個寄存器中的數值作為位址,然後再去加載這個位址中的資料的指令LW.

是以尋址模式是從指令如何擷取資料的角度,對指令的一種分類,目的是給編寫指令的人更多選擇。

指令的執行速度:

指令的執行速度:通過石英晶體的脈沖轉化成時鐘信号驅動的,每次高低電平的轉換就是一個周期。我們稱為時鐘周期。

通過石英晶體的脈沖轉換成時鐘信号驅動,每次高低電平的轉換就是一個周期,我們稱為時鐘周期

總結

64 位和 32 位比較有哪些優勢?

如果說的是 64 位寬 CPU,那麼有 2 個優勢:

  • 優勢 1:64 位 CPU 可以執行更大數字的運算,這個優勢在普通應用上不明顯,但是對于數值計算較多的應用就非常明顯。
  • 優勢 2:64 位 CPU 可以尋址更大的記憶體空間

如果 32 位/64 位說的是程式,

  • 32 位指令在 64 位機器上執行,困難不大,可以相容。
  • 如果是 64 位指令,在 32 位機器上執行就困難了。因為 32 位指令在 64 位機器執行的時候,需要的是一套相容機制;但是 64 位指令在 32 位機器上執行,32 位的寄存器都存不下指令的參數。
  • 作業系統也是一種程式,如果是 64 位作業系統,也就是作業系統中程式的指令都是 64 位指令,是以不能安裝在 32 位機器上。

繼續閱讀