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》一般用来申请比较大的内存
5》kmalloc的效率比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()