为什么kmalloc()比vmalloc()更有效?

时间:2016-11-30 14:27:04

标签: linux memory memory-management linux-kernel page-tables

我认为kmalloc()在内核中分配连续的物理页面,因为虚拟内存空间直接映射到物理内存空间,只需添加一个偏移量即可。

但是,我仍然不明白为什么它比vmalloc()更有效率。 它仍然需要通过页面表(内核页面表),对吗?因为当进程切换到内核时不会禁用MMU。那么为什么Linux直接将内核虚拟空间映射到物理内存呢?有什么好处?

include/asm-x86/page_32.h中,有:

#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))

为什么内核需要计算物理地址?它必须使用虚拟地址来访问内存,对吧?我无法弄清楚为什么需要物理地址。

1 个答案:

答案 0 :(得分:2)

您的查询: -

  • 为什么Kmalloc比vmalloc()效率更高?

kmalloc分配物理上连续(也几乎是连续)内存的区域。物理到虚拟地图是一对一的。

对于vmalloc(),为每个页面分配MMU / PTE值;物理到虚拟映射不是连续的。

vmalloc通常比kmalloc慢,因为它可能必须将缓冲区空间重新映射到几乎连续的范围内。 kmalloc从不重映。

  • 为什么Linux直接将内核虚拟空间映射到物理内存?

Linux内核中有一个概念称为DMA(直接内存访问),它需要连续的物理内存。所以当内核触发DMA操作时,我们需要指定物理上连续的内存。这就是我们需要直接内存映射的原因。

  • 为什么内核需要计算物理地址?它必须使用虚拟地址来访问内存,对吧?

对于这个问题的答案,你需要阅读虚拟内存和物理内存之间的区别。但简而言之,每个加载和存储操作都在物理内存(PC上的RAM)上执行

物理内存指向RAM。

虚拟内存指向硬盘的交换区域。