linux 内存管理

来源:互联网 发布:艾克里里变脸视频软件 编辑:程序博客网 时间:2024/06/15 20:38
内存管理:
结构体:
page(页)、zone(区)
其中zone分成三个
DMA、NORMAL、HIGHMEM
分配页的函数:
alloc_page(gfp_mask);
alloc_pages(gfp_mask, order);
_get_free_page(gfp_mask);
_get_free_pages(gfp_mask, order);
get_zerod_page(gfp_mask);
释放页的函数:
void _free_pages(struct page *page, unsigned int order);
void free_pages(unsigned long addr, unsigned int order);
void free_page(unsigned long addr);

void *kmalloc(size_t size, int flages);
标志可以分为三类:行为修饰符、区修饰符及类型
void kfree(const void *ptr);
kmalloc:分配的物理地址是连续的,虚拟地址也是连续的
vmalloc:分配的物理地址不一定是连续的,只是虚拟地址是连续的
void *vmalloc(unsigned long size);
void vfree(void *addr);

slab--slab分配器(目的:减少内存碎片):
为了便于数据的频繁分配和回收,编程者常常会用到一个空闲链表。
相互之间的关系:
高速缓存--多个slab
一个slab--多个对象
一般一个slab由一页组成(也可以多个物理连续的页组成)
slab的状态:满、部分满、空
slab分配器分配slab顺序:部分满slab>空slab>创建新的slab

static void *kmem_getpages(kmem_cache_t *cachep, int flags, int nodeid);
free_pages();
kmem_cache_t *kmem_cache_create(const char * name, size_t size,
size_t align, unsigned long flags,
void (*ctor)(void*, kmem_cache_t *, unsigned long),
void (*dtor)(void*, kmem_cache_t *, unsigned long));
kmem_cache_destroy();
void *kmem_cache_alloc(kmem_cache_t *cachep, int flags);
void kmem_cache_free(kmem_cache_t *cachep, void *objp);

kernel/fork.c中的一段代码:
kmem_cache_t *task_struct_cachep;
task_struct_cachep = kmem_cachep_create("task_struct", 
sizeof(struct task_struct),
ARCH_MIN_TASKALIGN,
SLAB_PANIC,
NULL,

NULL);


do_fork():
struct task_struct *tsk;

tsk = kmem_cache_alloc(task_struct_cachep, GFP_KERNEL);
if(!tsk)
return NULL;
释放:

kmem_cache_free(task_struct_cachep, tsk);


int err;
err = kmem_cache_destroy(task_struct_cachep);
if(err)
撤销高速缓存出错

内核栈:
内核栈:一般为双页(32bit8k,64bit16k)--中断栈共享这两页
单页栈激活,中断栈单独分配一页
所以:内核栈(大小4k-16k)
void *kmap(struct page *page);
void kunmap(struct page *page);
void *kmap_atomic(struct page *page, enum km_type type);
void *kumap_atomic(void *kvaddr, enum km_type type);











0 0