知識梳理之內存(適用於面試)

知識梳理之內存

1、   kmallocvmalloc是分配的是內核的內存,malloc分配的是用戶的內存

2、   kmalloc保證分配的內存在物理上是連續的,vmalloc保證的是在虛擬地址空間上的連續,malloc不保證任何東西(這點是自己猜測的,不一定正確)

3、   kmalloc能分配的大小有限,vmallocmalloc能分配的大小相對較大

4、   內存只有在要被DMA訪問的時候才需要物理上連續

5、   vmallockmalloc要慢

6、   kmallockmalloc的簡化版本,kzalloc就等於kmalloc的內存空間用0來填充分配出來的內存空間。

7、   kfree函數用來釋放kmalloc分配的內存。

1、頁面分配部分

對物理內存的定義方面,引入:節點(node)、內存區域(zone)、內存頁(page)。

內存區域(zone):linux將每個內存節點管理的物理內存劃分爲不同的內存區域,在代碼中以struct zone數據結構表示每一個內存區域。

內存頁(page):是物理內存管理中最小的單位。系統爲每個頁創建一個struct page對象。

內核將物理內存分爲三個區:ZONE_DMAZONE_NORMALLZONE_HIGHMEM

頁面分配函數:alloc_pages__get_free_pages,它們最終都會調用到alloc_pages_node,所以背後兩者的原理是一樣的。頁面的分配次序爲:ZONE_NORMALLZONE_DMA,而不會到ZONE_HIGHMEM中查找分配。

2slab分配器(slab allocator

       Linux系統在物理頁分配的基礎上實現了對更小內存分配的管理:slabslobslubslobslub主要針對大型系統和嵌入式系統。

       Slab分配器的基本思想是:先利用頁面分配器分配出單個或者一組連續的物理頁面,然後在此基礎上將整塊頁面分割成多個相等的小內存單元,以滿足小內存空間分配的需求。

       相關數據結構:struct kmem_cachestruct slabkmem_cache用於管理旗下所有的struct slab

       Slab結構用於管理一塊連續的物理頁面中內存對象的分配。其存放位置有兩種:一是將struct slab實例放在物理頁面首頁的開始處;二是放在物理頁面的外部。

       Slab分配器最終調用__alloc_pages去分配2order個連續的物理頁面,對於slab分配器而言,它只能在低端內存區分配物理頁面。

3、虛擬內存的管理

Linux內核將4GB的虛擬地址空間分爲兩大塊:頂部的1GB空間給內核使用,底部的3GB給用戶空間使用。內核代碼中使用PAGE_OFFSET宏來標示虛擬地址空間中內核部分的起始地址。

VmallocVfree

Vmalloc函數的實現原理主要有以下三個步驟:

1)  Vmalloc區分配出一段連續的虛擬內存區域(使用紅黑樹解決動態虛擬內存的分配與釋放)

2)  通過夥伴系統獲得物理頁

3)  通過對頁表的操作將步驟1中分配的虛擬內存映射到步驟2中獲得的物理頁上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章