vma_filesz = kmalloc_array(segs - 1, sizeof(*vma_filesz), GFP_KERNEL);
kmalloc_array 用来申请一个数组
static inline void *kmalloc_array(size_t n, size_t size, gfp_t flags)
{
if (size != 0 && n > SIZE_MAX / size)
return NULL;
if (__builtin_constant_p(n) && __builtin_constant_p(size))
return kmalloc(n * size, flags);
return __kmalloc(n * size, flags);
}
从kmalloc_array 的实现可以看到,首先慢但size 不能为0,且也不能超过最大的size
if (size != 0 && n > SIZE_MAX / size)
return NULL;
其次判断n和size是否是在编译阶段就可以确定,如果可以确定的话,就调用kmalloc,否则就调用__kmalloc申请内存
static inline void *kcalloc(size_t n, size_t size, gfp_t flags)
{
return kmalloc_array(n, size, flags | __GFP_ZERO);
}
kcalloc 是kmalloc_array的一个包装,及将申请的memory清零
如果在调用kmalloc_array(segs - 1, sizeof(*vma_filesz), GFP_KERNEL);的时候加上flag __GFP_ZERO,则和kcalloc的作用一样
及kmalloc_array(segs - 1, sizeof(*vma_filesz), GFP_KERNEL|__GFP_ZERO)
转载请注明原文地址: https://ju.6miu.com/read-668789.html