我认为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))
为什么内核需要计算物理地址?它必须使用虚拟地址来访问内存,对吧?我无法弄清楚为什么需要物理地址。
答案 0 :(得分:2)
您的查询: -
kmalloc分配物理上连续(也几乎是连续)内存的区域。物理到虚拟地图是一对一的。
对于vmalloc(),为每个页面分配MMU / PTE值;物理到虚拟映射不是连续的。
vmalloc通常比kmalloc慢,因为它可能必须将缓冲区空间重新映射到几乎连续的范围内。 kmalloc从不重映。
Linux内核中有一个概念称为DMA(直接内存访问),它需要连续的物理内存。所以当内核触发DMA操作时,我们需要指定物理上连续的内存。这就是我们需要直接内存映射的原因。
对于这个问题的答案,你需要阅读虚拟内存和物理内存之间的区别。但简而言之,每个加载和存储操作都在物理内存(PC上的RAM)上执行
物理内存指向RAM。
虚拟内存指向硬盘的交换区域。