我无法准确区分内核逻辑地址和虚拟地址。在 Linux 设备驱动程序书中,它说所有逻辑地址都是内核虚拟地址,并且虚拟地址没有任何线性映射。但是,当我们说它是合乎逻辑的,当我们说虚拟时,我们在什么情况下使用这两个?
请您参考如下方法:
Linux内核映射属于内核的大部分虚拟地址空间,以物理内存第一部分的偏移量进行1:1映射。 (对于 32 位 x86 而言,1Gb 略低于 1Gb,对于其他处理器或配置可能会有所不同)。例如,对于 x86 上的内核代码,地址 0xc00000001 映射到物理地址 0x1。
这称为逻辑映射 - 1:1 映射(带有偏移),允许内核访问机器的大部分物理内存。
但这还不够——有时我们在 32 位机器上有超过 1Gb 的物理内存,有时我们想将非连续的物理内存块引用为连续的以使事情变得简单,有时我们想映射不是 RAM 的内存映射 IO 区域。
为此,内核在其虚拟地址空间的顶部保留一个区域,在该区域中执行“随机”页到页映射。那里的映射不遵循逻辑映射区域的 1:1 模式。这就是我们所说的虚拟映射。
重要的是要补充一点,在许多平台上(x86 就是一个例子),逻辑和虚拟映射都是使用相同的硬件机制(TLB 控制虚拟内存)完成的。在许多情况下,“逻辑映射”实际上是使用处理器的虚拟内存设施完成的,所以这可能有点令人困惑。因此,不同之处在于完成映射的模式:逻辑为 1:1,虚拟为随机。