本文共 954 字,大约阅读时间需要 3 分钟。
size_t ksize(const void *block) 这个函数可以返回用kmalloc 申请memory的size其使用的例程如下:static int expand_corename(struct core_name *cn, int size){ char *corename = krealloc(cn->corename, size, GFP_KERNEL); if (!corename) return -ENOMEM; if (size > core_name_size) /* racy but harmless */ core_name_size = size; cn->size = ksize(corename); cn->corename = corename; return 0;}其源码分析如下:/* can't use ksize for kmem_cache_alloc memory, only kmalloc */size_t ksize(const void *block){ struct page *sp; int align; unsigned int *m; #形参为null,如果是debug版本的话,则会打印callstack BUG_ON(!block); #这里#define ZERO_SIZE_PTR ((void *)16) if (unlikely(block == ZERO_SIZE_PTR)) return 0; #得到形参的page sp = virt_to_page(block); #如果这个page 不属于slab,则这几返回复合页 if (unlikely(!PageSlab(sp))) return PAGE_SIZE << compound_order(sp); #计算最大的对齐size align = max_t(size_t, ARCH_KMALLOC_MINALIGN, ARCH_SLAB_MINALIGN); m = (unsigned int *)(block - align); #这里就返回通过kmalloc的size return SLOB_UNITS(*m) * SLOB_UNIT;}
转载地址:http://egjmi.baihongyu.com/