我不太能够准确区分核心逻辑地址和虚拟地址。在 Linux 设备驱动程序书中,它说所有的逻辑地址都是内核虚拟地址,而虚拟地址没有任何线性映射关系。但从逻辑上来讲,我们何时说逻辑地址和虚拟地址,在哪种情况下使用这两个术语呢?
基本上有三种寻址方式,它们分别是:
在Linux中,内核内存(在地址空间中)超出了3 GB(从3 GB到4 GB),即0xc000000... 内核使用的地址并非物理地址。为了映射虚拟地址,它使用PAGE_OFFSET。必须注意不涉及任何页面转换,即这些地址在本质上是连续的。然而,这方面存在一定的限制,即在x86上最多只能达到896 MB。超过这个限制后,就需要使用分页进行转换。当您使用vmalloc时,会返回这些地址以访问已分配的内存。
简而言之,当有人在用户空间的上下文中提及虚拟内存时,通常是通过分页来实现的。如果提及内核虚拟内存,则是通过PAGE_OFFSET或vmalloc的地址。
(参考-理解Linux内核-2.6版)
Shash
内核逻辑地址是通过正常的CPU内存访问函数可以访问到的映射。在32位系统中,即使使用的物理内存超过4GB,也只存在4GB的内核逻辑地址空间。使用kmalloc
可以分配由物理内存支持的逻辑地址空间。
虚拟地址不一定有相应的逻辑地址。您可以使用vmalloc
分配物理内存,并返回一个没有对应逻辑地址的虚拟地址(例如在具有PAE的32位系统中)。然后可以使用kmap
将逻辑地址分配给该虚拟地址。