1

我认为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))

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

4

1 回答 1

2

您的查询:-

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

kmalloc 分配物理上连续(也实际上是连续)的内存区域。物理到虚拟映射是一对一的。

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

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

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

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

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

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

物理内存指向 RAM。

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

于 2016-11-30T15:59:33.377 回答