获得页
linux通过一些alloc_pages的接口获得一个或者多个连续的页。下面的函数__alloc_pages实现了基于伙伴算法的页分配
kmalloc
下面是kmalloc的实现,kmalloc是从普通高速缓存中获得内存空间的。
linux为从32B开始的内存大小的对象提供了几何分布的高速缓存,分别从32B到128KB。如下图所示,这些高速缓存存放在一个叫cache_sizes的数组中。上面kmalloc就是从cache_sizes数组中找到合适大小的那个高速缓存项,然后调用__kmem_cache_alloc来分配普通高速缓存。
这里由于高速缓存的申请内存时是通过调用__get_free_pages来得到整块物理页的,所以kmalloc请求的内存是物理页连续的。这点与vmalloc不同,vmalloc请求的内存只保证虚拟内存连续。