核心游记之 内存管理 kmalloc kfree

原创 2008年09月28日 14:43:00

不知道从哪里开始,所以选择kmalloc . kfree先研究了!

 

2.6.14内核kmalloc代码如下(linux/mm/slab.h):

static inline void *kmalloc(size_t size, gfp_t flags)
{
    if (__builtin_constant_p(size)) {
        int i = 0;
#define CACHE(x) /
        if (size <= x) /
            goto found; /
        else /
            i++;
#include "kmalloc_sizes.h"
#undef CACHE
        {
            extern void __you_cannot_kmalloc_that_much(void);
            __you_cannot_kmalloc_that_much();
        }
found:
        return kmem_cache_alloc((flags & GFP_DMA) ?
            malloc_sizes[i].cs_dmacachep :
            malloc_sizes[i].cs_cachep, flags);
    }
    return __kmalloc(size, flags);
}

_builtin_constant_p(x) gcc  专用
如果x在编译的时候就能获得常值,则为TRUE;如果是变量则为FALSE

if分支真的时候往kmem_cache_alloc()走,假的时候往__kmalloc()走.

 

继续往__kmalloc(size, flags)方向跟.

mm/slab.c

void *__kmalloc(size_t size, gfp_t flags)
{
    kmem_cache_t *cachep;

    /* If you want to save a few bytes .text space: replace
     * __ with kmem_.
     * Then kmalloc uses the uninlined functions instead of the inline
     * functions.
     */
    cachep = __find_general_cachep(size, flags);
    if (unlikely(cachep == NULL))
        return NULL;
    return __cache_alloc(cachep, flags);
}

flags标记有GFP_USER、GFP_KERNEL、GFP_ATOMIC、GFP_DMA。

   size 已字节为单位

__find_general_cachep函数返回数组malloc_sizes[]的某个项,malloc_sizes

Linux kmalloc/kfree 源码解读

kmalloc/kfree用于划分和回收内核空间低区内存的方法。改组方法没有直接通过伙伴系统进行内存的划分,通过slab算法进行分配的。同时也为每个CPU提供一个阵列缓存,用于提高分配效率。下面对改组...
  • tq02h2a
  • tq02h2a
  • 2008年12月16日 20:21
  • 6337

动态分配内存接口malloc/kmalloc与释放内存接口free/kfree

动态分配内存接口malloc/kmalloc与释放内存接口free/kfree
  • yanlaifan
  • yanlaifan
  • 2016年08月25日 17:52
  • 949

内存管理器(十二)kernel内存管理----kmalloc/kfree

内存管理器(十二)kernel内存管理----kmalloc/kfree 前言 上一篇说了页的获取与释放,既然是内核内存管理,内核自然也有自己的一套内存分配与释放函数。go on! kmalloc( ...
  • zmrlinux
  • zmrlinux
  • 2015年11月06日 18:15
  • 415

核心游记之 内存管理paging_init

start_kernel ()          --> setup_arch ()                    --> paging_init ()                ...
  • mprc_jhq
  • mprc_jhq
  • 2008年10月07日 15:35
  • 965

核心游记之 内存管理 kmem_cache_init

系统启动函数 asmlinkage void __init start_kernel(void)。 调用 kmem_cache_init(); 看代码先.......
  • mprc_jhq
  • mprc_jhq
  • 2008年09月28日 16:27
  • 875

内存管理-之内核内存管理-基于linux3.10

关于启动过程内存管理见《内存管理-之启动》 如果需要,内存管理三篇文章整理成pdf了,下载地址http://download.csdn.net/detail/shichaog/8662135 第四章...
  • shichaog
  • shichaog
  • 2015年05月05日 22:22
  • 1836

kmalloc/kfree,vmalloc/vfree

导读:A.表示内存分配(最终总是调用get_free_pages来实现实际的分配;这就是GFP前缀的由来)是代表运行在内核空间的进程执行的。使用GFP_KERNEL容许kmalloc在分配空闲内存时候...
  • silentpebble
  • silentpebble
  • 2015年01月16日 09:36
  • 681

kmalloc kfree学习笔记

http://blog.csdn.net/hzn407487204/article/details/5482056 slub中的kmalloc和kfree学习笔记 ...
  • zhuxiaoping54532
  • zhuxiaoping54532
  • 2015年11月06日 11:13
  • 249

kmalloc分配物理内存与高端内存映射--Linux内存管理(十八)

日期 内核版本 架构 作者 GitHub CSDN 2016-09-29 Linux-4.7 X86 & arm gatieme LinuxDeviceDrive...
  • gatieme
  • gatieme
  • 2016年09月29日 21:08
  • 2535

linux内存管理之kmalloc

linux内存管理之kmalloc  http://blog.chinaunix.net/uid-20786208-id-4783115.html    这里只说物理内存管理 ...
  • zdy0_2004
  • zdy0_2004
  • 2015年10月01日 23:50
  • 707
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:核心游记之 内存管理 kmalloc kfree
举报原因:
原因补充:

(最多只允许输入30个字)