???
kmem_cache_node = &boot_kmem_cache_node;
kmem_cache = &boot_kmem_cache;
//申请slub缓冲区,管理数据放在临时结构中
create_boot_cache(kmem_cache_node, "kmem_cache_node",
sizeof(struct kmem_cache_node), SLAB_HWCACHE_ALIGN);
create_boot_cache(kmem_cache, "kmem_cache",
offsetof(struct kmem_cache, node) +
nr_node_ids * sizeof(struct kmem_cache_node *),
SLAB_HWCACHE_ALIGN);
//从刚才挂在临时结构的缓冲区中申请kmem_cache的kmem_cache,并将管理数据拷贝到新申请的内存中
kmem_cache = bootstrap(&boot_kmem_cache);
//从刚才挂在临时结构的缓冲区中申请kmem_cache_node的kmem_cache,并将管理数据拷贝到新申请的内存中
kmem_cache_node = bootstrap(&boot_kmem_cache_node);
???
}
1.2 创建kmalloc常规缓存
原则上系统会为每个2次幂大小的内存块申请一个缓存,但是内存块过小时,会产生很多碎片浪费,所以系统为96B和192B也各自创建了一个缓存。于是利用了一个size_index数组来帮助确定小于192B的内存块使用哪个缓存
void __init create_kmalloc_caches(unsigned long flags)
{
???
/*使用SLUB时KMALLOC_SHIFT_LOW=3,KMALLOC_SHIFT_HIGH=13

也就是说使用kmalloc能够申请的最小内存是8B,最大内存是8KB
申请内存是向上对其2的n次幂,创建对应大小缓存保存在kmalloc_caches [n]*/
for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++) {
if (!kmalloc_caches[i]) {
kmalloc_caches[i] = create_kmalloc_cache(NULL,
1 << i, flags);
}
/*
* Caches that are not of the two-to-the-power-of size.
* These have to be created immediately after the
* earlier power of two caches
*/
/*有两个例外,大小为64~96B和128B~192B,单独创建了两个缓存
保存在kmalloc_caches [1]和kmalloc_caches [2]*/
if (KMALLOC_MIN_SIZE <= 32 && !kmalloc_caches[1] && i == 6)
kmalloc_caches[1] = create_kmalloc_cache(NULL, 96, flags);
if (KMALLOC_MIN_SIZE <= 64 && !kmalloc_caches[2] && i == 7)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-76918-2.html
我没看懂MV前面写他粉丝怎么怎么欢迎
打完了把它拖到12海里以内来