116 / 163 · C11 · 约 8 分钟
内存虚拟化对话
先记住这句话
对话指出CPU虚拟化完成后,内存虚拟化才是真正的难点。用户程序发出的每个地址都是虚拟的,操作系统在硬件协助下将其映射为物理地址,从而让每个进程都以为自己拥有一块巨大、私有且连续的内存。这样做既让编程更轻松,也实现了进程间的隔离与保护。后续将从基址/界限寄存器讲起,逐步引入TLB和多级页表。
虚拟化尚未结束
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. 隔离保护:阻止一个进程窥探或破坏另一个进程的数据。
继续查证
标准草案与官方章节会更新;版本标记只说明示例最低要求。