static extent_node_t * base_chunk_alloc(size_t minsize) { extent_node_t *node; size_t csize, nsize; void *addr; assert(minsize != 0); /* 尝试从 base_nodes 中复用 node */ node = base_node_try_alloc(); /* Allocate enough space to also carve a node out if necessary. */ // 需要分配的 node 的内存 nsize = (node == NULL) ? CACHELINE_CEILING(sizeof(extent_node_t)) : 0; // 多分配 node size,也按照 chunk size 对齐 csize = CHUNK_CEILING(minsize + nsize); // 内部调用 chunk_alloc_mmap() addr = chunk_alloc_base(csize); if (addr == NULL) { if (node != NULL) base_node_dalloc(node); return (NULL); } base_mapped += csize; if (node == NULL) { // 使用 chunk 的起始内存 node = (extent_node_t *)addr; addr = (void *)((uintptr_t)addr + nsize); csize -= nsize; if (config_stats) { base_allocated += nsize; base_resident += PAGE_CEILING(nsize); } } extent_node_init(node, NULL, addr, csize, true, true); return (node); }