3.1 程式的機器級表示
發展歷史
Intel,AMD,ARM 等企業各有又是,CPU 從 8 位發展到 16 位,再到 32 位,近幾年發展到 64 位,當下的 CPU 體系被稱為 x86-64 體系結構,主要是 Intel 和 AMD 兩家的產品。
IA32 處理器體系結構是 32 位晶片。
CPU 的微觀檢視架構
當下的計算機大多是採用馮諾伊曼體系結構,計算機由儲存器,運算器,控制器,輸入裝置,輸出裝置組成。
IA32 的暫存器
通用暫存器的特殊用法
EAX:擴充套件累加暫存器。在乘法和除法指令中被自動使用;
ECX:迴圈計數器。
ESI和EDI:擴充套件源指標暫存器和擴充套件目的指標暫存器。用於記憶體資料的存取;
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*10H+0100H=09010H
\]
可見段首地址可以是任意的地址,這個段也就是以前彙編中學到的程式碼段,資料段等的地址。
分頁模式
將記憶體分割成4KB大小的頁面,同時將程式段的地址空間按記憶體頁的大小進行劃分。
- 頁面的大小往往是固定的
分頁模式的基本思想:當任務執行時,當前活躍的執行程式碼保留在記憶體中,而程式中當前未使用的部分,將繼續儲存在磁碟上。當CPU需要執行的當前程式碼儲存在磁碟上時,產生一個缺頁錯誤(也就是缺頁中斷),引起所需頁面的換進(從磁碟載入記憶體)。
通過分頁以及頁面的換進、換出,一臺記憶體有限的計算機上可以同時執行多個大程式,讓人感覺這臺機器的記憶體無限大,因此稱為虛擬記憶體。
在系統的記憶體金字塔中,所有的下層儲存都是上層儲存的快取,下層的速度更慢,但是成本低廉所以容量較大,上層速度更快但是更加昂貴因此容量也相對下一層要小得多。使用快取可以讓跨層的資料讀寫更加快速,因為高層的時間往往更加寶貴,相同的時間堵塞,層次越高,效能影響越大。