C++ / a working model

116 / 163   ·   C11   ·   约 8 分钟

内存虚拟化对话

先记住这句话

对话指出CPU虚拟化完成后,内存虚拟化才是真正的难点。用户程序发出的每个地址都是虚拟的,操作系统在硬件协助下将其映射为物理地址,从而让每个进程都以为自己拥有一块巨大、私有且连续的内存。这样做既让编程更轻松,也实现了进程间的隔离与保护。后续将从基址/界限寄存器讲起,逐步引入TLB和多级页表。

本篇内容
  1. 虚拟化尚未结束
  2. 用户地址永远是虚拟的
  3. 幻觉存在的两大理由
  4. 运行示例
  5. 动手练习

官方章节 PDF

虚拟化尚未结束

CPU已经虚拟化完毕,但内存虚拟化才刚刚开始。它涉及更多硬件与操作系统之间的精巧配合,必须把大量细节在头脑中理顺才能形成正确的心智模型。课程将从最简单的基址/界限机制入手,逐步加入新机制来应对新问题。

用户地址永远是虚拟的

牢记一条原则:用户程序产生的每一个地址都是虚拟地址。操作系统只是在制造幻觉,让每个进程都觉得自己独占一块巨大的私有内存。硬件帮助操作系统把这些“假”地址变成真正的物理地址,从而找到实际数据。

幻觉存在的两大理由

首先是编程方便:程序员可以把代码和数据随便放进一片看似巨大且连续的空间,而不必操心物理内存到底有多挤。其次是隔离与保护:一个行为异常的进程绝不能读取或破坏另一个进程的内存。

常见误区

  • 以为用户程序可以直接使用物理地址
  • 把地址转换完全当成软件的事而忽略硬件的作用
  • 低估内存虚拟化所需的细节数量

运行一个例子

最低标准 C11 · 完整程序 · 下载 .c

#include <stdio.h>
int main(void) {
    printf("User programs generate only virtual addresses.\n");
    return 0;
}

在本地编译

gcc -std=c11 -Wall -Wextra -Wpedantic -Werror ostep-12-dialogue-memory.c -o example && ./example

预期结果

User programs generate only virtual addresses.

CHECK YOUR UNDERSTANDING

合上答案,试着解释。

操作系统为什么要让每个用户进程都觉得自己拥有一块巨大、私有、连续的内存?请给出两个主要原因。

查看参考答案

1. 编程便利:程序员无需关心物理内存的实际布局和大小。2. 隔离保护:阻止一个进程窥探或破坏另一个进程的数据。

继续查证

标准草案与官方章节会更新;版本标记只说明示例最低要求。

回到目录