與直接映射的物理內存末端、高端內存的始端所對應的線性地址存放在high_memory變量中,在x86體系結構上,高于896MB的所有物理內存的范圍大都是高端內存,它并不會永久地或自動地映射到內核地址空間,盡管x86處理器能夠尋址物理RAM的范圍達到4GB(啟用PAE可以尋址到64GB)。一旦這些頁被分配,就必須in射到內核的邏輯地址空間上。在x86上,高端內存中的頁被映射到3GB-4GB。
內核可以采用三種不同的機制將頁框映射到高端內存;分別叫做永久內核映射、臨時內核映射以及非連續內存分配。在這里,只總結前兩種技術,第三種技術將在后面總結。
建立永久內核映射可能阻塞當前進程;這發生在空閑頁表項不存在時,也就是在高端內存上沒有頁表項可以用作頁框的“窗口”時。因此,永久內核映射不能用于中斷處理程序和可延遲函數。相反,建立臨時內核映射絕不會要求阻塞當前進程;不過,他的缺點是只有很少的臨時內核映射可以同時建立起來。
使用臨時內核映射的內核控制路徑必須保證當前沒有其他的內核控制路徑在使用同樣地映射。這意味著內核控制路徑永遠不能被阻塞,后者其他內核控制路徑有可能使用同一個窗口來映射其他的高端內存頁。
永久內存映射
永久內核映射允許內核建立高端頁框到內核地址空間的長期映射。他們使用住內核頁表中一個專門的頁表,其地址存放在變量pkmap_page_table中,這在前面的頁表機制管理區初始化中已經介紹過了。頁表中的表項數由LAST_PKMAP宏產生。因此,內核一次最多訪問2MB或4MB的高端內存。
該頁表映射的線性地址從PKMAP_BASE開始。pkmap_count數組包含LAST_PKMAP個計數器,pkmap_page_table頁表中的每一項都有一個。
高端映射區邏輯頁面的分配結構用分配表(pkmap_count)來描述,它有1024項,對應于映射區內不同的邏輯頁面。當分配項的值等于0時為自由項,等于1時為緩沖項,大于1時為映射項。映射頁面的分配基于分配表的掃描,當所有的自由項都用完時,系統將清除所有的緩沖項,如果連緩沖項都用完時,系統將進入等待狀態。
為了記錄高端內存頁框與永久內核映射包含的線性地址之間的聯系,內核使用了page_address_htable散列表。該表包含一個page_address_map數據結構,用于為高端內存中的每一個頁框進行當前映射。而該數據結構還包含一個指向頁描述符的指針和分配給該頁框的線性地址。
page_address()函數返回頁框對應的線性地址
kmap()函數建立永久內核映射。
kunmap()函數撤銷先前由kmap()建立的永久內核映射
如果頁確實在高端內存中,則調用kunmap_high()函數
-
Linux
+關注
關注
87文章
11230瀏覽量
208934 -
內存
+關注
關注
8文章
3002瀏覽量
73887 -
虛擬機
+關注
關注
1文章
908瀏覽量
28097
發布評論請先 登錄
相關推薦
評論