kmalloc()和vmalloc()

一、vmalloc()函数为了把物理上不连续的页面转换为虚拟地址空间上连续的页,必须专门建立页表项。还有,通过vmalloc()获得的页必须一个一个的进行映射(因为它们物理上不是连续的),这就会导致比直接内存映射大得多的缓冲区刷新。因为这些原因,vmalloc()仅在绝对必要时才会使用——典型的就是为了获得大块内存时,例如,当模块被动态插入到内核中时,就把模块装载到由vmalloc()分配的内存上。

kmalloc‍()是内核中最常见的内存分配方式,它最终调用伙伴系统的__get_free_pages()函数分配,(也就是说,对于分配高端内存来说,不能用kmalloc函数来进行分配)。根据传递给这个函数的flags参数,决定这个函数的分配适合什么场合,如果标志是GFP_KERNEL则仅仅可以用于进程上下文中,如果标志GFP_ATOMIC则可以用于中断上下文或者持有锁的代码段中。
kmalloc返回的线形地址是直接映射的,而且用连续物理页满足分配请求,且内置了最大请求数(2**5=32页)。

二、kmalloc()与kfree()对应,可以分配连续的物理内存;
vmalloc()与vfree()对应,可以分配连续的虚拟内存,但是物理内存不一定连续,适用于分配大量内存。

kmalloc和get_free_page申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移。

vmalloc分配内存的时候逻辑地址是连续的,但物理地址一般是不连续的,适用于那种一下需要分配大量内存的情况,如insert模块的时候。这种分配方式性能不入kmalloc。

kmalloc分配内存是基于slab,因此slab的一些特性包括着色,对齐等都具备,性能较好。物理地址和逻辑地址都是连续的

三、kmalloc和vmalloc区别

1、kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存
2、kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,但是物理内存不一定连续
3、kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大
4、内存只有在要被DMA访问的时候才需要物理上连续
5、vmalloc比kmalloc要慢

6、(主要区别)kmalloc()用于申请较小的、连续的物理内存;vmalloc()用于申请较大的内存空间,虚拟内存是连续的

猜你喜欢

转载自blog.csdn.net/YMY_mine/article/details/81636671