內核直接映射空間 PAGE_OFFSET~VMALLOC_START,kmalloc和__get_free_page()分配的是這里的頁面。二者是借助slab分配器,直接分配物理頁再轉換為邏輯地址(物理地址連續)。適合分配小段內存。此區域 包含了內核鏡像、物理頁框表mem_map等資源。
內核動態映射空間 VMALLOC_START~VMALLOC_END,被vmalloc用到,可表示的空間大。
內核映射空間 PKMAP_BASE ~ FIXADDR_START,kmap
內核臨時映射空間 FIXADDR_START~FIXADDR_TOP,kmap_atomic
當我們需要order(1)的空閑頁面塊時,則執行以下步驟:
1、初始空閑鏈表為:
order(0): 5, 10
order(1): 8 [8,9]
order(2): 12 [12,13,14,15]
order(3):
2、從上面空閑鏈表中,我們可以看出,order(1)鏈表上,有一個空閑的頁面塊,把它分配給用戶,并從該鏈表中刪除。
3、當我們再需要一個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):
因為內存映射先要獲得被映射的物理地址,然后才能將其映射到要求的用戶虛擬地址上。我們已經看到內核物理內存映射區域中的地址可以被內核函數virt_to_phys轉換成實際的物理內存地址,但對于vmalloc分配的內核虛擬地址無法直接轉化成物理地址,所以我們必須對這部分虛擬內存格外“照顧”——先將其轉化成內核物理內存映射區域中的地址,然后在用virt_to_phys變為物理地址。
轉化工作需要進行如下步驟:
找到vmalloc虛擬內存對應的頁表,并尋找到對應的頁表項。
獲取頁表項對應的頁面指針
通過頁面得到對應的內核物理內存映射區域地址。
Linux內存管理的知識今天Linux培訓機構就和大家講解這么多了,想要學習Linux的更多知識,可以來我們粵嵌科技來咨詢。