Linux地址映射(2)--内存申请

博客:fireaxe.blog.chinaunix.net 

 

Linux地址映射(2)--内存申请_第1张图片

如果申请的内存是低端内存,因为低端内存一直都被映射在内核页表中,因此只需要一个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抖动,所以性能很差,一般只有在必须申请大块内存时才使用,如动态插入模块时。

你可能感兴趣的:(操作系统,linux)