gpt4 book ai didi

linux - 为什么 kmalloc() 比 vmalloc() 更高效?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:01 57 4
gpt4 key购买 nike

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

为什么内核需要计算物理地址?无论如何它都必须使用虚拟地址来访问内存,对吗?我不明白为什么需要物理地址。

最佳答案

您的查询:-

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

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

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

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

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

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

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

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

物理内存指向RAM。

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

关于linux - 为什么 kmalloc() 比 vmalloc() 更高效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40890861/

57 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com