初學核心時,經常被「核心頁表」和「程序頁表」搞暈,不知道這到底是個啥東東,跟我們平時理解的頁表有和關係
。。核心頁表
程序頁表:每個程序自己的頁表,放在程序自身的頁目錄task_struct.pgd中。
在保護模式下,從硬體角度看,其執行的基本物件為「程序」(或執行緒),而定址則依賴於「程序頁表」,在程序排程而進行上下文切換時,會進行頁表的切換:即將新程序的pgd(頁目錄)載入到cr3暫存器中。從這個角度看,其實是完全沒有用到「核心頁表」的,那麼「核心頁表」有什麼用呢?跟「程序頁表」有什麼關係呢?
1、核心頁表中的內容為所有程序共享,每個程序都有自己的「程序頁表」
使用者態核心態
其中,核心態位址對應的相關頁表項,對於所有程序來說都是相同的(因為核心空間對所有程序來說都是共享的),而這部分頁表內容其實就**於「核心頁表」,即每個程序的「程序頁表」中核心態位址相關的頁表項都是「核心頁表」的乙個拷貝。
2、「核心頁表」由核心自己維護並更新,在vmalloc區發生page fault時,將「核心頁表」同步到「程序頁表」中。以32位系統為例,核心頁表主要包含兩部分:
線性對映區
vmalloc區
其中,線性對映區即通過task_size偏移進行對映的區域,對32系統來說就是0-896m這部分區域,對映對應的虛擬位址區域為task_size-task_size+896m。這部分區域在核心初始化時就已經完成對映,並建立好相應的頁表,即這部分虛擬記憶體區域不會發生page fault。
vmalloc區,為896m-896m+128m,這部分區域用於對映高階記憶體,有三種對映方式:vmalloc、固定、臨時,這裡就不像述了。。
以vmalloc為例(最常使用),這部分區域對應的線性位址在核心使用vmalloc分配記憶體時,其實就已經分配了相應的物理記憶體,並做了相應的對映,建立了相應的頁表項,但相關頁表項僅寫入了「核心頁表」,並沒有實時更新到「程序頁表中」,核心在這裡使用了「延遲更新」的策略,將「程序頁表」真正更新推遲到第一次訪問相關線性位址,發生page fault時,此時在page fault的處理流程中進行「程序頁表」的更新
關於使用者程序頁表和核心頁表
普通使用者程序的頁表也是存在核心空間的。這很容易理解,畢竟頁表沒有vma來對應。在應用程序建立的時候,task struct m struct描述記憶體資訊,mm gpd指定頁表基位址。頁表的分配是通過呼叫核心夥伴演算法介面分配到物理記憶體,核心在啟動階段已經建立了核心頁表,使用者程序的頁表可以分為...
程序頁表兩級結構 頁目錄和頁表頁
程序頁表的基本結構僅適合於小程序位址空間,在大位址空間下,該結構發生了變化。大虛址空間下的記憶體程序頁表結構採用頁表頁和頁目錄。32位意味著虛址空間可達4gb 虛址空間計算方法 32位的編址為232,232 210 210 210 22 4gb 1k 1024b 1m 1024k 1g 1024m ...
程序如何共享核心頁表
vmalloc vfree 如果核心態的程序呼叫vmalloc來請求記憶體,核心在處理過程中會修改核心頁表,但是並不會去修改程序的頁表。只是把可用的位址返回給程式。當程式使用這個位址addr的時候,由於程序本身的頁表沒有記錄該位址的資訊,所以會觸發缺頁異常。在缺頁異常的檢查過程中,會判斷這個位址所在...