seegongsik
操作系统

什么是内存保护

在第 9 课的虚拟内存里,我们看到每个程序都有只属于自己的内存,别人的内存连看都看不到。可其实,大家的数据都混在同一块真内存里。那么,是什么让你的和我的互相碰不到呢?出人意料的是,根本没有挡着的墙。

01

一块内存里混住着好几家

从假的角度看,好像各用各的,可在真内存里,大家都混在一起。A 的碎块和 B 的碎块挨着摆放。
要是 A 能碰到紧挨着的 B 的地方,A 的一个失误就可能弄坏 B,甚至偷看 B 的秘密。

真内存
A
B
A
B
B
A
A
B
A
B
B
A

真内存里,A(金色)和 B(蓝色)的碎块混在一起摆着。

这样混在一个空间里,看起来很不放心。可实际上,A 绝对碰不到 B。
是有什么结实的隔板挡在两者之间吗?不是。秘密在第 9 课看过的那张地图里。

02

不是墙,只是没有路

想想第 9 课的地图。A 的地图只指向 A 的真地方,通往 B 的地方的路,地图上压根没有。
所以 A 连说出“B 的地址”的办法都没有。
不是有墙把两者隔开,而是根本没有路可走。

A 地图
A1
✓
B1
没有路
A2
✓
B2
没有路
A3
✓

选 A:A 的地图只通往 A 的地方,没有通往 B 的箭头。

地图上没有路,就走不过去。可要是某个程序不小心或者故意,喊出一个地图之外的地址,会怎样呢?
这时,另一道安全装置就会启动。

03

想越线,就会被抓住

程序喊出一个自己地图上没有的地址,没有能换过去的真地方,转换就失败了。
那一刻,硬件马上察觉,报告给操作系统。操作系统说一声“你碰了不属于你的地方”,只把那个程序停下来。
坏的访问到头来也够不着。

轮流试试 A 的地址和 B 的地址:自己的能通过(绿色),别人的就被抓住、停下(红色)。

自己的顺利通过,别人的当场被抓。想越过边界的尝试,从来行不通。
多亏这样,带来一个很踏实的结果:一个程序坏了,也不会殃及别人。

04

一个坏了,其余照样没事

每个程序都被关在自己的格子里,坏掉的程序只能把自己的地方弄乱,碰不到别人的内存,也碰不到操作系统。
操作系统只把坏掉的那一个悄悄收拾掉,其余的程序就像什么都没发生一样继续运行。

P1
运行中
P2
运行中
P3
运行中

弄坏一个程序:只有它停下,其余的继续运行。

要是没有保护,坏掉的那一个会把所有程序都拖下水。多亏分开了,事故才停在一格里。
稳定和安全都由此而来,而它的根基不是“墙”,而是“各自的地图”。

05

分开就是保护

总结一下,内存保护并不是另外砌的墙。每个进程各有各的地图,彼此之间没有路;想越线就会被抓住,只停下那一个。
所以混住也不会撞车,一个坏了也不会殃及别人。分开本身,就是保护。

开关一下保护,就能看出差别:开着,事故关在一格里;关掉,就蔓延到全部。

到这里为止,操作系统都是在内部管理 CPU 和内存:让大家轮流用(分时 · 调度),把大家分开守护(虚拟内存 · 保护)。
可电脑还得和外面打交道:键盘、屏幕、磁盘,还有从没见过的新设备。
操作系统是怎么认出这么多设备的呢?那是下一个故事。

一句话总结内存保护不是挡路的墙,而是每个进程地图不同所带来的结果。自己的地图只指向自己的地方,所以压根就没有通往别人地方的路。想越线时,因为地址不在地图上,硬件会抓住它,操作系统只把那个程序停下来。所以一个坏了,其余照样没事。分开就是保护。
← 操作系统
如果有帮助,请支持我们