vmalloc
vfree
如果核心態的程序呼叫vmalloc來請求記憶體,核心在處理過程中會修改核心頁表,但是並不會去修改程序的頁表。只是把可用的位址返回給程式。當程式使用這個位址addr的時候,由於程序本身的頁表沒有記錄該位址的資訊,所以會觸發缺頁異常。
在缺頁異常的檢查過程中,會判斷這個位址所在空間,如果是在核心位址空間的vmalloc區,那麼核心會去核心頁表中檢視,該位址是不是在核心中有記錄。如果有記錄則把核心的addr對應的pmd項複製給程序的pmd項,意味著,程序和核心公用乙個pte頁表。
如果程序要釋放這個區域會發生什麼呢?其實修改的還是核心頁表,會把addr對應的pte頁表項設定為0。其它的都不做改變。那麼對於程序而言意味著什麼呢?當程序試圖訪問乙個已經被釋放區間的位址addr時候,由於它和核心對於addr的pmd項是一樣的,那麼,會繼續去訪問核心頁表關於addr的pte頁表,最後發現,pte頁表項為0,又觸發了缺頁異常。
這次的缺頁異常和上面分配的流程一樣,只是最後對核心頁表pte項做檢查時候,發現核心頁表關於addr的pte頁表項是0,就會報錯。這樣就避免了程序的非法訪問
核心頁表和程序頁表
初學核心時,經常被 核心頁表 和 程序頁表 搞暈,不知道這到底是個啥東東,跟我們平時理解的頁表有和關係 核心頁表 程序頁表 每個程序自己的頁表,放在程序自身的頁目錄task struct.pgd中。在保護模式下,從硬體角度看,其執行的基本物件為 程序 或執行緒 而定址則依賴於 程序頁表 在程序排程而...
關於使用者程序頁表和核心頁表
普通使用者程序的頁表也是存在核心空間的。這很容易理解,畢竟頁表沒有vma來對應。在應用程序建立的時候,task struct m struct描述記憶體資訊,mm gpd指定頁表基位址。頁表的分配是通過呼叫核心夥伴演算法介面分配到物理記憶體,核心在啟動階段已經建立了核心頁表,使用者程序的頁表可以分為...
Linux核心頁表
一 linux位址空間 arm的32位系統共支援4g的記憶體空間,其中0 3g為使用者空間,3g 4g是核心空間,arm採用2級頁表,32位位址空間address分別為 pgd pte 12bits,在核心 中分別為pgd 11位,pte 9 位,頁內位址12位 但是在mmu系統中對於arm的二級分...