3.1 程式的機器級表示

發展歷史

Intel,AMD,ARM 等企業各有又是,CPU 從 8 位發展到 16 位,再到 32 位,近幾年發展到 64 位,當下的 CPU 體系被稱為 x86-64 體系結構,主要是 Intel 和 AMD 兩家的產品。


IA32 處理器體系結構是 32 位晶片。

CPU 的微觀檢視架構

當下的計算機大多是採用馮諾伊曼體系結構,計算機由儲存器,運算器,控制器,輸入裝置,輸出裝置組成。

IA32 的暫存器

通用暫存器的特殊用法

  • EAX:擴充套件累加暫存器。在乘法和除法指令中被自動使用;

  • ECX:迴圈計數器。

  • ESIEDI:擴充套件源指標暫存器和擴充套件目的指標暫存器。用於記憶體資料的存取;

  • ESP:擴充套件堆疊指標暫存器。一般不用於算術運算和資料傳送,而用於定址堆疊上的資料。

  • EBP:擴充套件幀指標暫存器。用於引用堆疊上的函式引數和區域性變數;

特殊暫存器的用法

指令指標暫存器 EIP 也被稱為程式計數器,Program Counter 也就是簡稱 PC。

PC 存放著下一條要執行的指令的地址,如果遇到了跳轉,返回之類的指令,就會改變 PC 暫存器中儲存的值,使之指向下一個目的地。

32 位的標誌暫存器也就是 EFLAGS 暫存器,E 代表這個暫存器是 32 位的,FLAGS 代表裡面存放的是有關程式狀態的資訊,有些指令將會改變這個狀態資訊,而有的指令則會根據這類狀態資訊執行不同的分支操作。

系統暫存器

只允許在最高特權級別下的程式進行訪問的暫存器(例如作業系統核心),除此以外禁止應用程式訪問。

  • 中斷描述符表暫存器IDTR:儲存中斷描述符表的地址。

  • 全域性描述符表暫存器GDTR:儲存全域性描述符表的地址,全域性段描述符表包含了任務狀態段和區域性描述符表的指標。

  • 區域性描述符表暫存器LDTR:儲存當前正在執行的程式的程式碼段、資料段和堆疊段的指標。

  • 任務暫存器:儲存當前執行任務的任務狀態段的地址。

  • 除錯暫存器:用於除錯程式時設定斷點(breakpoint)。

IA32 的記憶體管理

實地址模式

在實地址模式下,處理器可以使用 20 位的地址匯流排,因此就可以訪問多達 \(2^{20}\) 大小的記憶體,也就是 1MB,而 8086 的 CPU 只有 16 位的地址匯流排,因而不能直接使用 20 位的記憶體地址,需要進行一種對映變換,讓 20 位的地址對映到 16 位的地址空間上。

為了實現這種對映,我們可以先考慮將多出來的 4 位作為記憶體的分段數量,而分出來的每一段都代表一個 16 位的地址空間,這樣只能控制 16 位實體記憶體的 8086CPU 也就可以處理高達 20 位的地址了,這是一種較為普遍而簡單的做法。

其中的段首地址不一定是整數,也有可能是一個比較不那麼湊整的數字。

\[08F1:0100 \\
08F1*10H+0100H=09010H
\]

可見段首地址可以是任意的地址,這個段也就是以前彙編中學到的程式碼段,資料段等的地址。

分頁模式

  • 將記憶體分割成4KB大小的頁面,同時將程式段的地址空間按記憶體頁的大小進行劃分。

    • 頁面的大小往往是固定的
  • 分頁模式的基本思想:當任務執行時,當前活躍的執行程式碼保留在記憶體中,而程式中當前未使用的部分,將繼續儲存在磁碟上。當CPU需要執行的當前程式碼儲存在磁碟上時,產生一個缺頁錯誤(也就是缺頁中斷),引起所需頁面的換進(從磁碟載入記憶體)。

  • 通過分頁以及頁面的換進、換出,一臺記憶體有限的計算機上可以同時執行多個大程式,讓人感覺這臺機器的記憶體無限大,因此稱為虛擬記憶體。

在系統的記憶體金字塔中,所有的下層儲存都是上層儲存的快取,下層的速度更慢,但是成本低廉所以容量較大,上層速度更快但是更加昂貴因此容量也相對下一層要小得多。使用快取可以讓跨層的資料讀寫更加快速,因為高層的時間往往更加寶貴,相同的時間堵塞,層次越高,效能影響越大。