Linux 記憶體管理:Kmem_cache_init

發表於2015-09-23

之前多多少少接觸過cache之類的東西,總覺的很神祕,當然cache就是為了讀寫記憶體更高效。比如檢視meminfo或者slabinfo的時候,你是否真的對記憶體機制理解的很清晰?
參考核心linux 3.8.13

我們看看呼叫它的函式介面:

這個函式在start_kernel裡呼叫. 下面我們就看看 kmem_cache_init(); //預設slab分配器

第一行來自一個全域性的指標變數,即為建立第一個cache( kmem_cache)
在mm/slab_common.c中
struct kmem_cache *kmem_cache;

建立的所有cache都會掛在LIST_HEAD(slab_caches); 這個全域性連結串列上.在cat /proc/slabinfo可以檢視》
這裡可以看看struct kmem_cache:在slab_def.h中

這個結構體裡面幾個關鍵的元素之前在kmalloc裡已經說到了。
而kmem_cache_boot則是:

註釋解釋的已經很清晰了.

而setup_nodelists_pointer的作用就是把struct kmem_cache裡array指標地址存放在nodelists.目的是為了便於操作指標.
對於一致性記憶體訪問,inode只有一個.

它是slab.c中靜態全域性變數

kmem_list3_init初始化slab的三個連結串列slabs_full、slabs_partial、slabs_free.為什麼初始化這個和cache組成結構有關係,可以看個圖:

這裡CACHE_CACHE在檔案的開頭部分被定義為0.

接著就要開始了真正的建立cache的工作,並且給出了初始化步驟和說明:

首先建立第一個cache它名為kmem_cache,並且kmem_cache指標變數指向了kmem_cache_boot.
下面我們看看create_boot_cache函式

而它接著呼叫了__kmem_cache_create:這是最關鍵的函式

它裡面有個很有趣的函式很關鍵的一個函式:它洩露了slab具體管理obj的佈局和方法.

經過上面的初始化和設定,最後呼叫setup_cpu_cache就完成了一個建立cache的工作.接著進行第2、3步的工作:

這裡在說一下cache_names和malloc_sizes:

這裡就不擴充套件開了.

create_kmalloc_cache實際上是呼叫create_boot_cache. 把kernel預定義的通用cache建立一遍.之後我們進入第四步、第5步:

最後把slab_state狀態設定為up 即已經可以正常使用了。雖然上面大部分是程式碼,具體申請記憶體的流程前面kmalloc已經講過了。僅僅是為了弄明白cache到底是個什麼玩意,以及如何初始化的。

在kmem_cache_init後,還有一個kmem_cache_init_late函式.
它主要是呼叫了enable_cpucache和註冊一個cpu通知連

還記不記得之前我們分析batchcount的時候的矛盾點?

它會根據obj size 計算limit值 ,再去計算batchcount的值.

這個只是一個小小的開始吧,記憶體管理本來就博大精深,只有遇到具體問題具體分析,來加深理解了.

相關文章