作者:馮利美,華清遠見嵌入式學院講師。
當一個任務(程序)執行系統調用而陷入核心代碼中執行時,我們就稱程序處于核心運作态(核心态)。在核心态下,CPU可執行任何指令。當程序在執行使用者自己的代碼時,則稱其處于使用者運作态(使用者态)。使用者态不能通路核心空間,包括代碼和資料。
程序處于使用者态時能通路的是使用者空間,處于核心态時能通路的稱為核心空間。
CPU執行程式所通路的位址都是虛拟位址,MMU 必須通過讀取控制寄存器CR3中的值作為目前頁面目錄的指針,進而根據分頁記憶體映射機制(參看相關文檔)将該虛拟位址轉換為真正的實體位址才能讓CPU真正的通路到實體位址。
程序有4G的尋址空間,其中第一部分為“使用者空間”,用來映射其整個程序空間(0x0000 0000-0xBFFF FFFF)即3G位元組的虛拟位址;第二部分為“系統空間”,用來映射(0xC000 0000-0xFFFF FFFF)1G位元組的虛拟位址。可以看出Linux系統中每個程序的頁面目錄的第二部分是相同的,是以從程序的角度來看,每個程序有4G位元組的虛拟空間,較低的3G位元組是自己的使用者空間,最高的1G位元組則為與所有程序以及核心共享的系統空間。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicEUK5SMtkjMz4Wb1x2bD9CXzV2Zh1WavwlbtVHbvN0Lcdmcv5SdkVmYtVmL3d3dvw1LcpDc0RHaiojIsJye.jpg)
if(資料在實體記憶體中)
{ 虛拟位址轉換成實體位址
讀資料 }
else
{ if(資料在磁盤中)
{
if(實體記憶體還有空閑)
{ 把資料從磁盤中讀到實體記憶體
虛拟位址轉換成實體位址
讀資料
}
else
{ 把實體記憶體中某頁的資料存入磁盤
把要讀的資料從磁盤讀到該頁的實體記憶體中
虛拟位址轉換成實體位址
讀資料
}
}
else
{ 報錯 } }