rte_malloc()為程序運行過程中分配內存,模擬從堆中動態分配內存空間。
1 void * 2 rte_malloc(const char *type, size_t size, unsigned align) 3 { 4 return rte_malloc_socket(type, size, align, SOCKET_ID_ANY); 5 }
rte_malloc()函數調用關系如下圖:
rte_malloc_socket():指定從哪個socket上分配內存空間,默認是指定SOCKET_ID_ANY,即,程序在哪個socket上運行,就從哪個socket上分配內存。如果指定的socket上沒有合適的內存空間,就再從其它socket上分配。
malloc_heap_alloc():從rte_config.mem_config->malloc_heaps[]數組中找到指定socket對應的堆(使用struct malloc_heap描述堆),即,從這個堆中分配空間。如果該堆是第一次使用,還沒有被初始化過,則調用malloc_heap_init()初始化;首先,調用find_suitable_element()在堆中查找是否有合適內存可以分配,如果沒有,則調用malloc_heap_add_memzone()在rte_config.mem_config->memzone[]中給堆分配一塊內存。最后,調用malloc_elem_alloc()在堆中,將需要分配的內存划分出去。
1 void * 2 malloc_heap_alloc(struct malloc_heap *heap, 3 const char *type __attribute__((unused)), size_t size, unsigned align) 4 { 5 if (!heap->initialised) 6 malloc_heap_init(heap); 7 8 size = CACHE_LINE_ROUNDUP(size); 9 align = CACHE_LINE_ROUNDUP(align); 10 rte_spinlock_lock(&heap->lock); 11 struct malloc_elem *prev, *elem = find_suitable_element(heap, 12 size, align, &prev); 13 if (elem == NULL){ 14 if ((malloc_heap_add_memzone(heap, size, align)) == 0) 15 elem = find_suitable_element(heap, size, align, &prev); 16 } 17 18 if (elem != NULL){ 19 elem = malloc_elem_alloc(elem, size, align, prev); 20 /* increase heap's count of allocated elements */ 21 heap->alloc_count++; 22 } 23 rte_spinlock_unlock(&heap->lock); 24 return elem == NULL ? NULL : (void *)(&elem[1]); 25 26 }
malloc_heap_init():主要是為struct malloc_heap數據結構的各個成員變量賦初始值,並將該堆的狀態設置為INITIALISED。
malloc_heap_add_memzone():調用rte_memzone_reserve(),在rte_config.mem_config->memzone[]中分配合適大小的內存。分配的內存的大小是mz_size = MAX(min_size, 11M),其中,min_size = size + align + MALLOC_ELEM_OVERHEAD * 2; size是rte_malloc()指定的需要分配內存的大小。如果memzone[]中沒有合適的內存塊,將mz_size減半,再次查找。
1 do { 2 mz = rte_memzone_reserve(mz_name, mz_size, numa_socket, 3 mz_flags); 4 if (mz == NULL) 5 mz_size /= 2; 6 } while (mz == NULL && mz_size > min_size);
find_suitable_element():在堆中找到一塊合適大小的內存,分配的內存是從堆的底部開始查找的。如果堆剩余內存不夠分配的,會再次調用malloc_heap_add_memzone()擴展堆的大小。
malloc_elem_alloc():查找到合適大小的內存塊后,將這一塊內存從堆中划分出去。
還是直接上圖直接點。。。。
錯誤之處,歡迎指正。
轉載請標注轉自http://www.cnblogs.com/MerlinJ/p/4092432.html。