與直接映射的物理內(nèi)存末端、高端內(nèi)存的始端所對(duì)應(yīng)的線性地址存放在high_memory變量中,在x86體系結(jié)構(gòu)上,高于896MB的所有物理內(nèi)存的范圍大都是高端內(nèi)存,它并不會(huì)永久地或自動(dòng)地映射到內(nèi)核地址空間,盡管x86處理器能夠?qū)ぶ肺锢?a href="http://m.xsypw.cn/tags/ram/" target="_blank">RAM的范圍達(dá)到4GB(啟用PAE可以尋址到64GB)。一旦這些頁被分配,就必須in射到內(nèi)核的邏輯地址空間上。在x86上,高端內(nèi)存中的頁被映射到3GB-4GB。
內(nèi)核可以采用三種不同的機(jī)制將頁框映射到高端內(nèi)存;分別叫做永久內(nèi)核映射、臨時(shí)內(nèi)核映射以及非連續(xù)內(nèi)存分配。在這里,只總結(jié)前兩種技術(shù),第三種技術(shù)將在后面總結(jié)。
建立永久內(nèi)核映射可能阻塞當(dāng)前進(jìn)程;這發(fā)生在空閑頁表項(xiàng)不存在時(shí),也就是在高端內(nèi)存上沒有頁表項(xiàng)可以用作頁框的“窗口”時(shí)。因此,永久內(nèi)核映射不能用于中斷處理程序和可延遲函數(shù)。相反,建立臨時(shí)內(nèi)核映射絕不會(huì)要求阻塞當(dāng)前進(jìn)程;不過,他的缺點(diǎn)是只有很少的臨時(shí)內(nèi)核映射可以同時(shí)建立起來。
使用臨時(shí)內(nèi)核映射的內(nèi)核控制路徑必須保證當(dāng)前沒有其他的內(nèi)核控制路徑在使用同樣地映射。這意味著內(nèi)核控制路徑永遠(yuǎn)不能被阻塞,后者其他內(nèi)核控制路徑有可能使用同一個(gè)窗口來映射其他的高端內(nèi)存頁。
永久內(nèi)存映射
永久內(nèi)核映射允許內(nèi)核建立高端頁框到內(nèi)核地址空間的長期映射。他們使用住內(nèi)核頁表中一個(gè)專門的頁表,其地址存放在變量pkmap_page_table中,這在前面的頁表機(jī)制管理區(qū)初始化中已經(jīng)介紹過了。頁表中的表項(xiàng)數(shù)由LAST_PKMAP宏產(chǎn)生。因此,內(nèi)核一次最多訪問2MB或4MB的高端內(nèi)存。
該頁表映射的線性地址從PKMAP_BASE開始。pkmap_count數(shù)組包含LAST_PKMAP個(gè)計(jì)數(shù)器,pkmap_page_table頁表中的每一項(xiàng)都有一個(gè)。
高端映射區(qū)邏輯頁面的分配結(jié)構(gòu)用分配表(pkmap_count)來描述,它有1024項(xiàng),對(duì)應(yīng)于映射區(qū)內(nèi)不同的邏輯頁面。當(dāng)分配項(xiàng)的值等于0時(shí)為自由項(xiàng),等于1時(shí)為緩沖項(xiàng),大于1時(shí)為映射項(xiàng)。映射頁面的分配基于分配表的掃描,當(dāng)所有的自由項(xiàng)都用完時(shí),系統(tǒng)將清除所有的緩沖項(xiàng),如果連緩沖項(xiàng)都用完時(shí),系統(tǒng)將進(jìn)入等待狀態(tài)。
為了記錄高端內(nèi)存頁框與永久內(nèi)核映射包含的線性地址之間的聯(lián)系,內(nèi)核使用了page_address_htable散列表。該表包含一個(gè)page_address_map數(shù)據(jù)結(jié)構(gòu),用于為高端內(nèi)存中的每一個(gè)頁框進(jìn)行當(dāng)前映射。而該數(shù)據(jù)結(jié)構(gòu)還包含一個(gè)指向頁描述符的指針和分配給該頁框的線性地址。
page_address()函數(shù)返回頁框?qū)?yīng)的線性地址
kmap()函數(shù)建立永久內(nèi)核映射。
kunmap()函數(shù)撤銷先前由kmap()建立的永久內(nèi)核映射
如果頁確實(shí)在高端內(nèi)存中,則調(diào)用kunmap_high()函數(shù)
-
Linux
+關(guān)注
關(guān)注
87文章
11411瀏覽量
212214 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3099瀏覽量
74848 -
虛擬機(jī)
+關(guān)注
關(guān)注
1文章
955瀏覽量
28849
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Linux內(nèi)核之內(nèi)存映射原理分析
Linux內(nèi)核地址映射模型與Linux內(nèi)核高端內(nèi)存詳解

評(píng)論