我认为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))
为什么内核需要计算物理地址?无论如何,它必须使用虚拟地址来访问内存,对吧?我无法弄清楚为什么需要物理地址。