kernel 3.10使用slub,不是slab文件Slub.c (android\kernel\mm)Slab_common.c (android\kernel\mm)-------全局变量和接口----------------/*Slab cache management.*/struct kmem_cache {struct kmem_cache_cpu __percpu *cpu_slab;   //每CPU变量,只保留一个slab,当没有空闲内存的情况下才会从kmem_cache_node中换出其他的slab。/* Used for retriving partial slabs etc */unsigned long flags;unsigned long min_partial;int size;/* The size of an object including meta data,meta data一般是个4字节的指针,用于指向下一个空闲的object,从而形成一个object的链表*/int object_size;/* The size of an object without meta data , 该slab cache中的每个slab的大小,单位是字节 */int offset;/* Free pointer offset. 重要,空闲的object的偏移量*/int cpu_partial;/* Number of per cpu partial objects to keep around */struct kmem_cache_order_objects oo;/* Allocation and freeing of slabs */struct kmem_cache_order_objects max;struct kmem_cache_order_objects min;gfp_t allocflags;/* gfp flags to use on each alloc */int refcount;/* Refcount for slab cache destroy */void (*ctor)(void *);int inuse;/* Offset to metadata */int align;/* Alignment */int reserved;/* Reserved bytes at the end of slabs */const char *name;/* Name (only for display!) ,slab分配器的名字,一般会带size的尾数,如“kmalloc-64” */struct list_head list;/* List of slab caches , 用于将该slab分配器链入到链表slab_caches中*/#ifdef CONFIG_SYSFSstruct kobject kobj;/* For sysfs */#endifstruct kmem_cache_node *node[MAX_NUMNODES];   //对于UMA系统,MAX_NUMNODES==0,即只有1个node};/* The slab lists for all objects.*/struct kmem_cache_node {spinlock_t list_lock;#ifdef CONFIG_SLUBunsigned long nr_partial;struct list_head partial;  //物理页面部分满(即物理页面有空闲空间)的slab的 list#ifdef CONFIG_SLUB_DEBUGatomic_long_t nr_slabs;atomic_long_t total_objects;struct list_head full;   //物理页面全满(即没有空闲空间)的slab的 list#endif#endif};struct kmem_cache_cpu {void **freelist;/* Pointer to next available object, 指向下一个空闲的object,即离page开始地址的偏移量 */unsigned long tid;/* Globally unique transaction id */struct page *page;/* The slab from which we are allocating, 是从哪个slab(即slab的某个page)中分配的object? */struct page *partial;/* Partially allocated frozen slabs */};/* Maximum size for which we actually use a slab cache */#define KMALLOC_MAX_CACHE_SIZE(1UL << KMALLOC_SHIFT_HIGH(13))  //kmalloc时,如果要从slab中分配内存,最大能malloc的size,否则要从buddy system(page allocator)中去分配更多的page,见__kmalloc()初始化:mm_init() -> kmem_cache_init()->create_kmalloc_caches()->create_kmalloc_cache()struct kmem_cache *kmem_cache;  //slab_caches  //存放所有的slab cache(即slab分配器)的liststruct kmem_cache *kmalloc_caches[KMALLOC_SHIFT_HIGH(12) + 1];  //预先创建好的slab分配器数组,数组的索引一般表示该slab分配器是只含有2^index字节的slab(个别除外),见kmalloc_slab()//分配kmem_cache型数据kmem_cache_zalloc()->kmem_cache_alloc()->slab_alloc()->slab_alloc_node(){//如果需要分配新的物理页面->__slab_alloc()->new_slab_objects()->new_slab()->allocate_slab()->alloc_slab_page()->alloc_pages()}page->slab_cache = s;  //保存page 所属的slab分配器__SetPageSlab(page); //page->flags |= 1 << PG_slab; 为页框增加一个slab属性.page->freelist = start; //第一个free的object的地址page->objects    //page中有多少objectpage->inuse   //有多少使用了的??struct page *mem_map;  //这是数组,存放所有的stuct page的信息
page->_count //页的引用计数器。如果该字段为-1,则相应页框空闲,并可被分配给任一进程或内核本身;如果该字段的值大于或等于0,则说明页框被分配给一个或多个进程,或用于存放一些内核数据结构。//page_count()函数返回_count加1后的值,也就是该页的使用者的数目。
//释放kfree()->slab_free()->set_freepointer()
------如何计算某个虚拟地址A对应的page的指针(虚拟地址)
/* pt A 找出A对应的物理地址PA */或者是PA = A-0XC0000000+0X80000000(chip的memory map中的DDR的基地址)
2)算出物理地址的全局帧号 g_pfn=PA>>12位  并获得内存节点的起始帧号  contig_page_data_=_(    node_zones = ((watermark = (942, 2312, 2548), percpu_drift_mark = 0, lo    node_zonelists = ((zlcache_ptr = 0x0 = , _zonerefs = ((zone = 0xC0FCA140     nr_zones = 1,    node_mem_map = 0xC12B5000 = __bss_stop+0xC64,   //====>  ==mem_map的值    bdata = 0xC0F03178 = bootmem_node_data,    node_start_pfn = 0x00080000,   //=====>  node的起始帧号,这个是DDR的物理起始地址,见CHIP的memory map    node_present_pages = 167680,    node_spanned_pages = 195840,    node_id = 0,    reclaim_nodes = (bits = (0)),    kswapd_wait = (lock = (rlock = (raw_lock = (slock = 5570645, tickets = (owner = 85, next = 85)))),     pfmemalloc_wait = (lock = (rlock = (raw_lock = (slock = 0, tickets = (owner = 0, next = 0)))),     kswapd = 0xE6959500 = __bss_stop+0x256A5164,    kswapd_max_order = 0,    classzone_idx = ZONE_NORMAL)
因此物理帧号在mem_map数组中的偏移为:g_pfn-0x80000


更多相关文章

  1. Android及JavaSE游戏引擎LGame-0.2.9发布(新增物理引擎支持)
  2. android 4.4 添加物理按键
  3. Android 屏蔽物理键盘
  4. android 增加物理按键关闭wifi实例讲解
  5. android 物理键盘 关键因素
  6. Android内存分配回收机制
  7. Android 2d物理引擎Box2d的使用示例

随机推荐

  1. Android(安卓)统计图表引擎AChartEngine(
  2. Android(安卓)UI设计模式实例代码
  3. Android零基础入门
  4. ch017 Android(安卓)样式与主题
  5. android:id="@*android:id/seekbar" 注意
  6. android那些事——android的成长
  7. android 设置全屏方法2
  8. 【Android】Android(安卓)4.0 无法接收开
  9. Android(安卓)输入法框架 (1)
  10. Android(安卓)Studio Android(安卓)UI控