什么是内存保护
在第 9 课的虚拟内存里,我们看到每个程序都有只属于自己的内存,别人的内存连看都看不到。可其实,大家的数据都混在同一块真内存里。那么,是什么让你的和我的互相碰不到呢?出人意料的是,根本没有挡着的墙。
一块内存里混住着好几家
从假的角度看,好像各用各的,可在真内存里,大家都混在一起。A 的碎块和 B 的碎块挨着摆放。
要是 A 能碰到紧挨着的 B 的地方,A 的一个失误就可能弄坏 B,甚至偷看 B 的秘密。
这样混在一个空间里,看起来很不放心。可实际上,A 绝对碰不到 B。
是有什么结实的隔板挡在两者之间吗?不是。秘密在第 9 课看过的那张地图里。
不是墙,只是没有路
想想第 9 课的地图。A 的地图只指向 A 的真地方,通往 B 的地方的路,地图上压根没有。
所以 A 连说出“B 的地址”的办法都没有。
不是有墙把两者隔开,而是根本没有路可走。
选 A:A 的地图只通往 A 的地方,没有通往 B 的箭头。
地图上没有路,就走不过去。可要是某个程序不小心或者故意,喊出一个地图之外的地址,会怎样呢?
这时,另一道安全装置就会启动。
想越线,就会被抓住
程序喊出一个自己地图上没有的地址,没有能换过去的真地方,转换就失败了。
那一刻,硬件马上察觉,报告给操作系统。操作系统说一声“你碰了不属于你的地方”,只把那个程序停下来。
坏的访问到头来也够不着。
轮流试试 A 的地址和 B 的地址:自己的能通过(绿色),别人的就被抓住、停下(红色)。
自己的顺利通过,别人的当场被抓。想越过边界的尝试,从来行不通。
多亏这样,带来一个很踏实的结果:一个程序坏了,也不会殃及别人。
一个坏了,其余照样没事
每个程序都被关在自己的格子里,坏掉的程序只能把自己的地方弄乱,碰不到别人的内存,也碰不到操作系统。
操作系统只把坏掉的那一个悄悄收拾掉,其余的程序就像什么都没发生一样继续运行。
弄坏一个程序:只有它停下,其余的继续运行。
要是没有保护,坏掉的那一个会把所有程序都拖下水。多亏分开了,事故才停在一格里。
稳定和安全都由此而来,而它的根基不是“墙”,而是“各自的地图”。
分开就是保护
总结一下,内存保护并不是另外砌的墙。每个进程各有各的地图,彼此之间没有路;想越线就会被抓住,只停下那一个。
所以混住也不会撞车,一个坏了也不会殃及别人。分开本身,就是保护。
开关一下保护,就能看出差别:开着,事故关在一格里;关掉,就蔓延到全部。
到这里为止,操作系统都是在内部管理 CPU 和内存:让大家轮流用(分时 · 调度),把大家分开守护(虚拟内存 · 保护)。
可电脑还得和外面打交道:键盘、屏幕、磁盘,还有从没见过的新设备。
操作系统是怎么认出这么多设备的呢?那是下一个故事。