天天看點

關于使用者空間和核心空間

作者:馮利美,華清遠見嵌入式學院講師。

當一個任務(程序)執行系統調用而陷入核心代碼中執行時,我們就稱程序處于核心運作态(核心态)。在核心态下,CPU可執行任何指令。當程序在執行使用者自己的代碼時,則稱其處于使用者運作态(使用者态)。使用者态不能通路核心空間,包括代碼和資料。

程序處于使用者态時能通路的是使用者空間,處于核心态時能通路的稱為核心空間。

CPU執行程式所通路的位址都是虛拟位址,MMU 必須通過讀取控制寄存器CR3中的值作為目前頁面目錄的指針,進而根據分頁記憶體映射機制(參看相關文檔)将該虛拟位址轉換為真正的實體位址才能讓CPU真正的通路到實體位址。

程序有4G的尋址空間,其中第一部分為“使用者空間”,用來映射其整個程序空間(0x0000 0000-0xBFFF FFFF)即3G位元組的虛拟位址;第二部分為“系統空間”,用來映射(0xC000 0000-0xFFFF FFFF)1G位元組的虛拟位址。可以看出Linux系統中每個程序的頁面目錄的第二部分是相同的,是以從程序的角度來看,每個程序有4G位元組的虛拟空間,較低的3G位元組是自己的使用者空間,最高的1G位元組則為與所有程序以及核心共享的系統空間。

關于使用者空間和核心空間

if(資料在實體記憶體中)

        {        虛拟位址轉換成實體位址

                 讀資料 }

        else

        {     if(資料在磁盤中)

              {

                     if(實體記憶體還有空閑)

                     {          把資料從磁盤中讀到實體記憶體

                                 虛拟位址轉換成實體位址

                                 讀資料

                     }

                     else

                     {          把實體記憶體中某頁的資料存入磁盤

                                 把要讀的資料從磁盤讀到該頁的實體記憶體中

                                 虛拟位址轉換成實體位址

                                 讀資料

                     }

              }

              else

              {     報錯        } }

繼續閱讀