關於使用者程序頁表和核心頁表

2021-10-04 04:35:02 字數 743 閱讀 4068

普通使用者程序的頁表也是存在核心空間的。這很容易理解,畢竟頁表沒有vma來對應。在應用程序建立的時候,task_struct->m_struct描述記憶體資訊,mm->gpd指定頁表基位址。頁表的分配是通過呼叫核心夥伴演算法介面分配到物理記憶體,核心在啟動階段已經建立了核心頁表,

使用者程序的頁表可以分為兩個部分,其指定了不僅有0-3gb(傳統32位系統)的使用者空間對映(也可能還沒建立對映),還有3-4gb的核心空間頁。而3-4gb的核心空間頁表是核心之前就已經建立好的,使用者程序頁表會複製核心頁表。所以我們說,所有的使用者程序共享核心頁表。

使用者程序在通過中斷或者系統呼叫進入核心之後,mmu頁表基位址依舊是當前程序的頁表基位址,只不過在核心態可以訪問所有的位址空間(0-4gb),當然這時候在核心態如果訪問低位址(0-3gb)記憶體的話,就是訪問到了當前程序的使用者位址空間。因此使用copy_from_user的時候,使用者空間位址引數在核心是可以訪問的,因為此時核心可以訪問該程序的使用者空間頁表。copy_to_user也一樣。

在vmalloc區發生page fault時,將「核心頁表」同步到「程序頁表」中。這部分區域對應的線性位址在核心使用vmalloc分配記憶體時,其實就已經分配了相應的物理記憶體,並做了相應的對映,建立了相應的頁表項,但相關頁表項僅寫入了「核心頁表」,並沒有實時更新到「程序頁表中」,核心在這裡使用了「延遲更新」的策略,將「程序頁表」真正更新推遲到第一次訪問相關線性位址,發生page fault時,此時在page fault的處理流程中進行「程序頁表」的更新。

以上個人理解,如有偏差,歡迎指正。

核心頁表和程序頁表

初學核心時,經常被 核心頁表 和 程序頁表 搞暈,不知道這到底是個啥東東,跟我們平時理解的頁表有和關係 核心頁表 程序頁表 每個程序自己的頁表,放在程序自身的頁目錄task struct.pgd中。在保護模式下,從硬體角度看,其執行的基本物件為 程序 或執行緒 而定址則依賴於 程序頁表 在程序排程而...

程序頁表兩級結構 頁目錄和頁表頁

程序頁表的基本結構僅適合於小程序位址空間,在大位址空間下,該結構發生了變化。大虛址空間下的記憶體程序頁表結構採用頁表頁和頁目錄。32位意味著虛址空間可達4gb 虛址空間計算方法 32位的編址為232,232 210 210 210 22 4gb 1k 1024b 1m 1024k 1g 1024m ...

程序如何共享核心頁表

vmalloc vfree 如果核心態的程序呼叫vmalloc來請求記憶體,核心在處理過程中會修改核心頁表,但是並不會去修改程序的頁表。只是把可用的位址返回給程式。當程式使用這個位址addr的時候,由於程序本身的頁表沒有記錄該位址的資訊,所以會觸發缺頁異常。在缺頁異常的檢查過程中,會判斷這個位址所在...