分类:
2011-05-18 12:19:47
原文地址:Linux地址映射(2)--内存申请 作者:fireaxe
如果申请的内存是低端内存,因为低端内存一直都被映射在内核页表中,因此只需要一个page_address()函数就可以完成转换,也就是图中的线性映射。
如果申请的是高端内存,就没有这么简单了。
首先,如果可以在高端申请到足够的内存,需要先在非线性区映射,操作结束后在解除映射,我们可以使用kmap()与kunmap()解决这个问题。如果高端内存找不到足够的内存,则会在低端内存区分配一块,此时也该回调用kmap()与kunmap()函数,但内部实现时就只是调用page_address()获取地址,而不需要再映射到非线性区。
1. 进程空间内存分配
malloc/free:最常用的内存分配函数
valloc/free:分配的内存按页对齐
2. 内核空间内存分配
__get_free_pages/free_pages:分配制定页数的低端内存,不能分配在高端
Alloc_pages/__free_pages:分配izhiding页数的内存,可以是高端内存
Kmalloc/kfree:分配的内存物理上连续,只能在低端分配
Vmalloc/vfree:分配的内存在内核空间中连续,物理上无需连续。Vmalloc由于不需要屋里也连续,会造成TLB抖动,所以性能很差,一般只有在必须申请大块内存时才使用,如动态插入模块时。