這次的鐵人賽也已經完成一半拉。
在前半段的內容我們花了大量的時間,在講檔案系統和 system call。接下來,我們要調轉方向,從記憶體管理和PCI設備開始研究網卡相關的議題。
在程式開發中,我們常常提到記憶體地址,然而這些地址實際上都是虛擬地址,並不是 RAM 內部實際存放資料的物理地址。虛擬地址必須經過一系列的轉換與映射,才能夠對應到 RAM 的物理地址,這個過程涉及到 Segmentation(分段)、Paging(分頁)、TLB(Translation Lookaside Buffer)、MMU(Memory Management Unit)等結構與技術。
首先,我們需要了解 address space(地址空間)的概念。Address space 是一個參照,我們討論的記憶體地址,這個數字本身並沒有直接意義,只有在特定的 address space 範圍內,它才具備實際意義。
程式在執行時,使用的是虛擬記憶體地址。為了能夠實際存取 RAM,虛擬記憶體地址需要被轉換成 RAM 使用的物理地址。這個轉換過程對程式本身是透明的,完全由 CPU 的硬體自動完成,負責這個記憶體轉換的模組稱為 Memory Management Unit (MMU)。
在 Intel 的 CPU 架構中,虛擬地址又稱為邏輯地址(Logical Address)。從邏輯地址到物理地址的轉換過程包含兩個步驟:
這兩層的轉換都是由 MMU 自動完成的。接下來兩天,我們會分別看看 Paging 跟 Segmentation 是如何運作的。