linux内核研究-7-内存管理

来源:互联网 发布:人工智能给企业的影响 编辑:程序博客网 时间:2024/05/05 21:48

 linux内核研究-7-内存管理

 

 

1,说在前面:

1》内存分成一定大小的‘页’

2》内核以‘页’为最小单位进行管理。也就是说内核管理内存的最小单位是‘页’

3》每个物理页对应一个页结构体 struct page

 

2,内存管理函数->kmalloc函数:

Void *kmalloc(size_t size,int flags)

1》 内存申请的内核函数之一

2》 分配的内存的物理地址是连续的

3》 分配的内存的虚拟地址也是连续的

4》一般用来申请以‘字节’为单位的内存

5》 flags一般是GFP_KERNEL,和GFP_ATOMIC

6》 GFP_ATOMIC不能休眠,一般用在中断处理函数里。

 

3,内存管理函数->vmalloc函数:

1》 内存申请的内核函数之一

2》 分配的内存的物理地址可能不是连续的

3》分配的内存的虚拟地址是连续的

4》一般用来申请比较大的内存

5kmalloc的效率比vmalloc高,所以一般用kmalloc,除非你打算要很多的内存时。这时用kmalloc可能会失败,因为很可能没有连续这么大的物理内存块。

 

 

4,页管理函数

1》 页分配函数簇

Alloc_page(gfp_mask)

Alloc_pages(gfp_mask,order)

_get_free_page(gfp_mask)

_get_free_pages(gfp_mask,order)

Get_zeroed_page(gfp_mask)

2》 页释放函数簇

_free_pages()

Free_pages()

Free_page()

 

5,slab分配器

1》为了尽量避免频繁的内存分配和释放造成很多了内存碎片而引入

2》咱们自己也可创建空闲列表来优化,但是自己的没有全局控制,最好用slab

3》 slab函数簇

kmem_cache_alloc()

kmem_cache_free()

4》 在使用slab之前应首先分配高速缓存

Kmem_cache_create()

Kmem_cache_destroy()

 

原创粉丝点击