可重入核心,是指多個程序可以同時處於核心態下,也就是說可以多個程序可以併發的執行核心**。對於但處理器來說某一時刻只能有乙個程序被cpu處理,其他處於核心態的程序處於阻塞或者掛起等待狀態。
對於linux來說,可重入核心**包含可重入函式和非可重入函式。
可重入函式是指執行時只改變區域性資料結構,不改變全域性資料結構;
不可重入函式是指執行該函式時也需要改變全域性資料結構。
所以,如果有多個程序進入不可重入函式時,需要相應的鎖機制來保證同一時刻只有乙個程序改變涉及到的全域性資料。
乙個核心**指令序列,我們可以成為核心控制路徑(kernel control path).
當有多個程序處於核心態時,則多個核心控制路徑需要交錯的被cpu執行,具體情況有以下幾種:
(1)程序a進入核心態,執行核心控制路徑p1; 程序b進入核心態,執行核心控制路徑p2. p1先被執行,當由於某些原因,p1被阻塞,那麼cpu會進行程序切換,切換到程序b,執行p2. 這種情形是兩個程序內的不同核心控制路徑交錯進行。
(2) 程序a進入核心態,執行核心控制路徑p1.cpu執行p1過程中,發生異常。則p1被掛起,cpu執行程序a的核心控制路徑p2.當p2執行完後,p1被啟用,cpu繼續執行p1.p2和p1都在程序a的上下文環境中。這種情形是同乙個程序內的多個核心控制路徑交錯進行。
(3)程序a進入核心態,cpu執行a的核心控制路徑p1.此時有硬體中斷到來,則該p1被掛起,cpu開始執行處理此硬體中斷的中斷指令,即執行核心控制路徑p2.核心處理完硬體中斷後,繼續執行p1.
(4)程序a進入核心態,cpu執行a的核心控制路徑p2,此時有處於核心態的且高優先順序的程序b搶斷cpu。則cpu開始執行程序b的核心控制路徑。
處於核心態和使用者態的程序都有自己的程序位址空間(process address space).、每個程序都有自己的記憶體位址空間。處於使用者態的程序,其程序位址空間包含**區,資料區,以及私有棧。
處於核心態的程序,其**區和資料區都是共享核心的,但是擁有自己的私有棧。也就是不同的核心控制路徑,共享核心的**區和資料區,但還有自己的私有棧。
程序-->使用者態: **區、資料區、私有棧。
-->核心態: 私有棧。 **區和資料區時核心提供的共享區。
因此,當核心控制路徑交錯執行時,只有私有棧是每個路徑自己的,其他都是共享核心的。
不同的程序有自己的程序位址空間,當程序之間需要通訊時,可以共享自己的部分程序位址空間,或者使用記憶體對映技術將共享的記憶體區域對映到自己的位址空間上。
深入理解Linux核心 程序位址空間
給核心分配記憶體和給使用者態程序分配記憶體是有區別的 1 核心的優先順序最高,如果某個核心函式請求動態記憶體,不會被延時 2 核心信任自己,不必保護措施 3 使用者態程序對動態記憶體的請求被認為不是緊迫的,總是被盡量推遲分配 4 使用者程序總是不可信任的 程序的位址空間 1 由允許程序使用的全部線性...
深入理解Linux核心 程序
1 程序的靜態特性 程序 程式執行時的乙個例項 程序描述符 task struct 程序的基本資訊 thread info 指向記憶體區描述符的指標 mm struct 程序相關的tty tty struct 當前目錄 fs struct 指向 檔案描述符的指標 files struct 所接收的訊...
Linux核心之程序位址空間
程序使用的是虛擬記憶體中的位址,也叫線性位址,由作業系統協助相關硬體 如mmu 對映到實體地址。線性位址是通過頁表 page table 對映到物理記憶體,頁表由作業系統維護並被處理器引用。核心空間在頁表中擁有較高特權級,因此使用者態程式試圖訪問這些頁時會導致乙個頁錯誤。在linux中,核心空間是持...