4.3 地址空间
地址空间是一段范围的地址。一般来说有下面两种类型的地址空间:
-
物理地址,一般被用来访问真实的硬件中的字节数据。既然是硬件,自然也就有对应的内存容量。处理器没有办法超出这个容量。处理器的可操作的地址范围是由寻址能力决定的。例如,一个 32 位系统每个进程的最大内存都不能超过 4GB,因为地址的取值范围最多就到 2 的 32 次方,也就是 4GB。即使系统有 4GB 的寻址能力,我们也可以不给机器装这么多内存,装 1GB 还是 2GB 是我们的自由。这种情况下有些物理地址空间就是无效地址应禁止访问,因为这些地址后面没有真正有效的内存单元。
-
逻辑地址,是应用内看到的内存地址。
在汇编指令 mov rax, [0x10bfd] 中,0x10bfd 就是一个逻辑地址。
程序员会有一种只有自己在使用内存的幻觉。无论通过寻址找到的是哪个内存单元,永远都不会看到其它程序的数据或者指令,即使这些程序正在和他的程序同时执行。但实际在物理内存中,同一时刻又确实会有不同程序的数据。
在我们的场景中,虚拟地址和逻辑地址是同义词。
在两种地址空间之间进行翻译的角色叫做 MMU(Memory Management Unit),MMU 是一种硬件,翻译过程会借助内存中的多个翻译表。