linux頁表問題

2021-09-21 05:13:03 字數 980 閱讀 6797

1.核心頁表問題 

kmalloc與kmem_cache_alloc之後的頁表 

就比如說誰也沒有規定你不能在中斷處理裡面呼叫schedule,而且 你完全可以在沒有呼叫spin_lock的情況下調spin_unlock,會出問題嗎?出問題的是你自己,這個世界不會因為刀可以殺人就不用刀切菜了。啟動之後,任何kmalloc或kmem_cache_alloc的呼叫都從夥伴系統把頁拉出來,頁表已經設定好了。 

vmalloc後的頁表 

這個分配函式頁後,必須顯式地更新頁表,因為vmalloc分配的頁面不屬於物理對映,而是屬於3g+896m後的vmalloc區域的對映區域,在vmalloc後必須set_pte而vfree後必須清除頁表。 

但是問題來了,在vmalloc後雖然設定了vmalloc的頁表,但是並沒有清除原來的頁表(為了使得討論方便我這裡故意假設vmalloc在 3g+896以下分配),也就是兩個頁表對應同乙個頁面(物理對映和vmalloc對映),事實上是這樣的,但是雖然理論上是這樣,但實際上又沒有意義 呢?實際上沒有意義,我們知道,訪問乙個位址是因為我們需要它,很多情況下這個位址是乙個資料結構,而包括資料結構在內的所有記憶體都來自夥伴系統,如果乙個位址已經被實體地址映**,說明它已經不在夥伴系統空閒鍊錶裡面了,那麼同樣來自夥伴空閒頁鏈的vmalloc還會得到相同的頁面嗎?原則上你完全可以並行訪問這兩個虛擬位址,但事實上這將是一種自虐行為。 

2.使用者頁表問題 

使用者頁表問題是簡單的,比如在mmap系統呼叫裡面,修改的只是一些vm區域的字段,比如start,end之類的,真正的頁表設定將推遲到缺頁的發生。但是在umap時必須清除頁表。 

事情真的就是這樣嗎?事實上就是這樣,但是要注意的是,這個時候最少兩個地方對映著使用者的物理記憶體,乙個是使用者空間,乙個是初始化時候的物理對映。 

綜上,真正修改頁表就在那麼幾個點,分別為:系統啟動,使用者缺頁,vmalloc,仔細看一下do_pagefault的**,涉及核心缺頁,就是vmalloc導致的,這涉及到另乙個問題,就是init_mm的懶惰更新。

linux的臨時頁表對映問題

linux核心初始化的時候要啟動分頁,既然要啟動分頁就要有相應的頁表,有頁表就要有頁目錄,很多人都知道系統啟動的時候要把實體地址的0 8m對映到虛擬位址的0 8m還要再對映到768m 768m 8m,這到底是為什麼呢?頁目錄的乙個目錄項對映4m的記憶體,為了對映8m的記憶體就要兩個目錄項,具體就是第...

Linux核心頁表

一 linux位址空間 arm的32位系統共支援4g的記憶體空間,其中0 3g為使用者空間,3g 4g是核心空間,arm採用2級頁表,32位位址空間address分別為 pgd pte 12bits,在核心 中分別為pgd 11位,pte 9 位,頁內位址12位 但是在mmu系統中對於arm的二級分...

linux 臨時頁表

armv8 linux4.9 檢視dma map前後mmu page table的變化的時候,有看到有的page table entry映 2m的size,這個2m的entry是何時建立的,目的是什麼是這邊部落格要弄清楚的問題。arm64 定義頁框大小的define位置如下,每乙個頁表項對映乙個頁框...