你看到的所有地址都不是真的 | 虚拟地址与物理地址 (2)

那么如何对每个进程使用的地址进行保护(protection)呢?继续使用物理内存模型肯定是不行了,因此操作系统创造了一个新的内存抽象,引入了一个新的内存模型,那就是虚拟地址空间,很多书中都会直接称呼为 “地址空间(Address Space)”。

虚拟寻址 Virtual Addressing

我先通俗地解释下虚拟地址空间和虚拟地址的概念,直接上书中的定义读起来有点生涩。

就是说每个进程的栈啊、堆啊、代码段啊等等它们的实际物理内存地址对于这个进程来说是不可见的,谁也不能直接访问这个物理地址。

那我们怎么去访问这个进程呢?

操作系统会给每个进程分配一个虚拟地址空间(vitural address),每个进程包含的栈、堆、代码段这些都会从这个地址空间中被分配一个地址,这个地址就被称为虚拟地址。底层指令写入的地址也是虚拟地址。

每个进程都拥有一个自己的地址空间,并且独立于其他进程的地址空间。也就是说一个进程中的虚拟地址 28 所对应的物理地址与另一个进程中的虚拟地址 28 所对应的物理地址是不同的,这样就不会发生冲突了。

可以这么理解,物理地址就是一个仓库,虚拟地址就是一个门牌,比方说一共有三十个门牌,那么所有的进程都能看见这三十个门牌,但是他们看见的某个相同门牌,指向的并不是同一个仓库。

OK,下面再来看《现代操作系统 - 第 3 版》书中对于地址空间的解释,应该很容易理解了:

地址空间是一个进程可用于寻址内存的一套地址集合。每个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程的地址空间(除了在一些特殊情况下进程需要共享它们的地址空间外)。

地址空间的概念非常通用,并且在很多场合中出现。比如电话号码,在美国和很多其他国家,一个本地电话号码通常是一个 7 位的数字。因此,电话号码的地址空间是从 0 000 000 到 9 999 999。

地址空间也可以是非数字的,以 “.com” 结尾的网络域名的集合也是地址空间。这个地址空间是由所有包含 2~63 个字符并且后面跟着 “.com” 的字符串组成的,组成这些字符串的字符可以是字母、数字和连字符。

到现在你应该已经明白地址空间的概念了,它是很简单的。

有了虚拟地址空间后,CPU 就可以通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到内存之前会先被转换成合适的物理地址,这个虚拟地址到物理地址的转换过程称为 地址翻译/地址转换(address translation)。

地址翻译需要 CPU 硬件和操作系统的密切合作:CPU 上的内存管理单元(Memory Management Unit,MMU)就是专门用来进行虚拟地址到物理地址的转换的,不过 MMU 需要借助存放在内存中的查询表,而这张表的内容正是由操作系统进行管理的。

那么,上述这一套 CPU 生成虚拟地址并进行地址翻译的流程就是虚拟寻址(virtual addressing)。举个例子,看下图:

你看到的所有地址都不是真的 | 虚拟地址与物理地址

References

《操作系统导论 - [美] 雷姆兹·H.阿帕希杜塞尔》

《现代操作系统 - 第 3 版》

《深入理解计算机系统 - 第 3 版》

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzxjf.html