內(nèi)核直接映射空間 PAGE_OFFSET~VMALLOC_START,kmalloc和__get_free_page()分配的是這里的頁面。二者是借助slab分配器,直接分配物理頁再轉(zhuǎn)換為邏輯地址(物理地址連續(xù))。適合分配小段內(nèi)存。此區(qū)域 包含了內(nèi)核鏡像、物理頁框表mem_map等資源。
內(nèi)核動態(tài)映射空間 VMALLOC_START~VMALLOC_END,被vmalloc用到,可表示的空間大。
內(nèi)核映射空間 PKMAP_BASE ~ FIXADDR_START,kmap
內(nèi)核臨時映射空間 FIXADDR_START~FIXADDR_TOP,kmap_atomic
當(dāng)我們需要order(1)的空閑頁面塊時,則執(zhí)行以下步驟:
1、初始空閑鏈表為:
order(0): 5, 10
order(1): 8 [8,9]
order(2): 12 [12,13,14,15]
order(3):
2、從上面空閑鏈表中,我們可以看出,order(1)鏈表上,有一個空閑的頁面塊,把它分配給用戶,并從該鏈表中刪除。
3、當(dāng)我們再需要一個order(1)的塊時,同樣我們從order(1)空閑鏈表上開始掃描。
4、若在order(1)上沒有空閑頁面塊,那么我們就到更高的級別(order)上找,order(2)。
5、此時(order(1)上沒有空閑頁面塊)有一個空閑頁面塊,該塊是從頁面12開始。該頁面塊被分割成兩個稍微小一些order(1)的頁面塊,[12,13]和[14,15]。[14,15]頁面塊加到order(1)空閑鏈表中,同時[12,13]頁面塊返回給用戶。
6、終空閑鏈表為:
order(0): 5, 10
order(1): 14 [14,15]
order(2):
order(3):
因?yàn)閮?nèi)存映射先要獲得被映射的物理地址,然后才能將其映射到要求的用戶虛擬地址上。我們已經(jīng)看到內(nèi)核物理內(nèi)存映射區(qū)域中的地址可以被內(nèi)核函數(shù)virt_to_phys轉(zhuǎn)換成實(shí)際的物理內(nèi)存地址,但對于vmalloc分配的內(nèi)核虛擬地址無法直接轉(zhuǎn)化成物理地址,所以我們必須對這部分虛擬內(nèi)存格外“照顧”——先將其轉(zhuǎn)化成內(nèi)核物理內(nèi)存映射區(qū)域中的地址,然后在用virt_to_phys變?yōu)槲锢淼刂贰?br />
轉(zhuǎn)化工作需要進(jìn)行如下步驟:
找到vmalloc虛擬內(nèi)存對應(yīng)的頁表,并尋找到對應(yīng)的頁表項(xiàng)。
獲取頁表項(xiàng)對應(yīng)的頁面指針
通過頁面得到對應(yīng)的內(nèi)核物理內(nèi)存映射區(qū)域地址。
Linux內(nèi)存管理的知識今天Linux培訓(xùn)機(jī)構(gòu)就和大家講解這么多了,想要學(xué)習(xí)Linux的更多知識,可以來我們粵嵌科技來咨詢。