在linux内核中我们经常使用kmalloc()进行内存分配,那么kmalloc()是如何分配的呢?
本文主要对kmalloc()和slab内存分配器进行分析。
废话不多说,直接上code:
devm_kzalloc(&pdev->dev, sizeof(*lpi2c_imx), GFP_KERNEL);
{
#define GFP_KERNEL (__GFP_RECLAIM | __GFP_IO | __GFP_FS)
#define __GFP_RECLAIM ((__force gfp_t)(___GFP_DIRECT_RECLAIM|___GFP_KSWAPD_RECLAIM))
}
drivers/base/devres.c
devm_kmalloc(dev, size, gfp | __GFP_ZERO);
{
struct devres
{
struct devres_node node;
unsigned long long data[]; /* guarantee ull alignment */
};
struct devres *dr;
dr = alloc_dr(devm_kmalloc_release, size, gfp, dev_to_node(dev));
{
size_t tot_size = sizeof(struct devres) + size;
从slab中开始分配内存
dr = kmalloc_node_track_caller(tot_size, gfp, nid);
{
#define kmalloc_node_track_caller(size, flags, node) \
__kmalloc_node_track_caller(size, flags, node, _RET_IP_)
mm/slab.c
__do_kmalloc_node(size, flags, node, caller);
{
struct kmem_cache *cachep;
根据size从kmalloc_caches[N]中获取合适的kmem_cache,kmalloc_caches是在
kmem_cache_init()-> create_kmalloc_caches()的时候进行初始化,code如下:
create_kmalloc_caches(unsigned long flags) mm/slab_common.c
{
for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++)
{
new_kmalloc_cache(i, flags);
{
可知kmalloc_caches[idx]的大小跟kmalloc_info[idx].size相关
kmalloc_info的定义在mm/slab_common.c中,以下为定义的一部分:
{NULL, 0}, {"kmalloc-96", 96},
{"kmalloc-192", 192}, {"kmalloc-8 8},
{"kmalloc-16", 16}, {"kmalloc-32", 32},
{"kmalloc-64", 64}, {"kmalloc-128", 128}
通过对kmalloc_info的分析,可知kmalloc能分配的最大内存为64M,因为
数组中size的最大值为{"kmalloc-67
本文主要对kmalloc()和slab内存分配器进行分析。
废话不多说,直接上code:
devm_kzalloc(&pdev->dev, sizeof(*lpi2c_imx), GFP_KERNEL);
{
#define GFP_KERNEL (__GFP_RECLAIM | __GFP_IO | __GFP_FS)
#define __GFP_RECLAIM ((__force gfp_t)(___GFP_DIRECT_RECLAIM|___GFP_KSWAPD_RECLAIM))
}
drivers/base/devres.c
devm_kmalloc(dev, size, gfp | __GFP_ZERO);
{
struct devres
{
struct devres_node node;
unsigned long long data[]; /* guarantee ull alignment */
};
struct devres *dr;
dr = alloc_dr(devm_kmalloc_release, size, gfp, dev_to_node(dev));
{
size_t tot_size = sizeof(struct devres) + size;
从slab中开始分配内存
dr = kmalloc_node_track_caller(tot_size, gfp, nid);
{
#define kmalloc_node_track_caller(size, flags, node) \
__kmalloc_node_track_caller(size, flags, node, _RET_IP_)
mm/slab.c
__do_kmalloc_node(size, flags, node, caller);
{
struct kmem_cache *cachep;
根据size从kmalloc_caches[N]中获取合适的kmem_cache,kmalloc_caches是在
kmem_cache_init()-> create_kmalloc_caches()的时候进行初始化,code如下:
create_kmalloc_caches(unsigned long flags) mm/slab_common.c
{
for (i = KMALLOC_SHIFT_LOW; i <= KMALLOC_SHIFT_HIGH; i++)
{
new_kmalloc_cache(i, flags);
{
可知kmalloc_caches[idx]的大小跟kmalloc_info[idx].size相关
kmalloc_info的定义在mm/slab_common.c中,以下为定义的一部分:
{NULL, 0}, {"kmalloc-96", 96},
{"kmalloc-192", 192}, {"kmalloc-8 8},
{"kmalloc-16", 16}, {"kmalloc-32", 32},
{"kmalloc-64", 64}, {"kmalloc-128", 128}
通过对kmalloc_info的分析,可知kmalloc能分配的最大内存为64M,因为
数组中size的最大值为{"kmalloc-67