查看原文
其他

虚拟还是真实?『黑客帝国』带你进入疯狂的矩阵世界

小雪 看雪学院 2019-05-25


最近天气越来越冷了,非常适合下了班后,宅在被窝里,来观看一部好电影。今天就为大家推荐一部程序员们非常值得一看的电影——《黑客帝国》


第一次遇见《黑客帝国》是看到它狂拽酷炫的海报,但提到黑客帝国,相信大多数看过电影的人都对电影中那个经典的“子弹飞”场景,过目不忘。



这是一部科幻电影的经典作品,充满了哲学、宗教、科技、武打、枪战等诸多元素,当里面的主角各个身穿黑客大衣,戴着黑色墨镜,用干净利落的中国功夫过招时,实在是令人叹为观止!


电影中用到的视觉特效,更是让人连连惊呼:居然1999年就能拍出这么牛的片子了吗?


更加难得的是,除了华丽的特效,电影中还有极其深刻的科幻思考,引发了巨大的轰动。



《黑客帝国》一共有三部,讲述了一名在矩阵中生活的网络黑客尼奥(Neo)发现看似正常的现实世界实际上是由一个名为“矩阵”的计算机人工智能系统控制的,并在一名神秘女郎崔妮蒂的引导下见到了黑客组织的首领墨菲斯。尼奥在墨菲斯的指引下,回到了真正的现实中,逃离了矩阵,三人走上了抗争矩阵征途的故事。



What is Matrix?



《黑客帝国》的英文名为“The Matrix”。


Matrix在英文中最为常见的两个释义,一个为“发源地”,而另一个为“矩阵”。



在电影中,Matrix是一套复杂的模拟系统程序,它是由具有人工智能的机器建立的,模拟了人类以前的世界,连接着无数人的意识,系统分配给他们不同的角色,就像电脑游戏中的角色扮演一样,用以控制人类。


Matrix不仅是一个虚拟程序,也是一个实际存在的地方。在这里,人类的身体被放在一个盛满营养液的器皿中,身上插满了各种插头以接受电脑系统的感官刺激信号。



人类就依靠这些信号,生活在一个完全虚拟的电脑幻景中。机器用这样的方式占领了人类的思维空间,用人类的身体作为电池以维持自己的运行。人类通过这种联网的虚拟生活来维持自身的生存需要,只是他们没有选择角色的权利和意识。


在Matrix中出现的人物,都可以看做是具有人类意识特征的程序。这些程序根据所附着的载体不同有三类:一类是附着在生物载体上的,就是在矩阵中生活的普通人;一类是附着在电脑芯片上的,就是具有人工智能的机器,这些载体通过硬件与Matrix连接;而另一类则是自由程序,它没有载体,再诸如特工、先知、建筑师、梅罗文加、火车人等。


Matrix中的智能程序,也就是先知的角色,发现在系统中有1%的人由于自主意识过强,不能兼容系统分配的角色,如果对他们不进行控制就会导致系统的不稳定,进而导致系统崩溃。因此编写Matrix的智能程序,也就是建筑师制造了“救世主”,让他有部分自主意识,并成为觉醒人类的领袖,带领他们建造了锡安。

 


The Matrix as an Operating System



这一次,让我们一起来尝试将Matrix看做一个操作系统来理解。

 

The Matrix World


整个矩阵世界,相当于一个正在运行的具有用户空间的操作系统(我们人类居住的普通世界)。显然的,这是一个颇有缺陷的操作系统。

 


People


居住在Matrix中的人类,则相当于进程,包括内核进程和用户进程。一般进程,“非特权”进程和具有root权限的后台进程(“特工”)还是有很大的区别。具有root权限的后台进程可以使用特权端口,销毁随机进程,管理内存等等。

 


Matrix


相当于内核。它看上去是基于消息传递的内核结构,不一定是微内核结构(尽管它们具有微内核的某些部分,比如拥有大量内核进程,进程之间都是严格独立的,以及已提到的消息传递机制)。


内核管理所有的进程,以及进程上的操作(比如保持进程活跃,为进程服务,回收进程)。但是这仍有一个明显的安全缺陷:某些用户进程能够将它们的部分代码传送到内核空间并执行(因为一个bug)。


只有某些系统调用受到影响(类似于 “phones”),这种扩大了的特权篡改了用户进程的返回栈,因此,如果该进程接收到一个信号,它会产生段错误并被作为垃圾回收(你如果在Matrix中被杀掉的话,那么你就真的死掉了)。



 

The Architect


相当于硬件上的内核监控(管理者),负责监控进程,销毁那些“畸形”进程并对销毁的进程进行重启。由于它是一个实时的具有高度可靠性的系统,在硬件上进行调试和监控显然具有最高的优先级,而且还绝对是可靠的(因此,为了降低出错的可能性,也降低它的复杂性)。


由于它频繁地进行可用性检查,造成了过度的错误配置,消耗了太多的资源,因此影响到了操作系统的正常运作。


 


Oracle


相当于进程(任务)调度器。拥有处理监听(资源利用率)的所有数据以及提前(这很显然)知道怎样对它们进行最优调度。

 



Agents


相当于系统监控/入侵防护/具有启发式操作的防护系统(IDS(入侵检测系统)/IPS(信息处理系统))。它们中绝大多数都有一个内核部分(或内核模块)但基本上却是那些具有超级用户特权的后台进程在用户空间运行。它们的职责是发现试图入侵系统安全的进程并销毁掉。

 



The Trainman:


相当于内核和用户空间的网关/信息传递队列。你如果想要合法地在用户空间和内核进行数据传递必须通过这里来进行。当然,你也可能永远被困在排队队列中。

 


The Merovingian:


相当于网络/IPC(进程间通信)。它的职责是掌握进程之间都发生了什么。输入/输出数据的一个偶然错误将以一个bug的形式表现出来。




Vampires/ghosts


相当于老版本API/KPI的兼容器。由于历史原因,这些代码并不完善,但与某些内核进程相连的代码却不应该不完整。

 



Keymaster


相当于安全/特权子系统。它很稳定,但不幸的是需要依赖不完善的VM(虚拟内存)系统和IPC系统,因此它可被进程利用来获取更多的特权。

 



Agent Smith


相当于有特权的IPC后台程序,具有部分内核模块功能。它与内核模块关系密切,且能够不通过完整性检查而与内核共享数据结构。


一旦它被另一个特权进程销毁掉,它也能藏身于一个系统调用中间以便于监控者重启它,此时它的进程描述符也被破坏,这样使得它的大部分程序代码将在内核中执行。


它将继续以这种受损状态长时间工作,锲入到一个循环中,并将进程错误地标记为安全漏洞,同时重写它的某些内存页。


电影中的特工史密斯实际上就是矩阵这个程序世界中的杀毒程序,他们在矩阵中是没有身体的,由于他们是杀毒程序,所以他们被矩阵赋予了超越常人的能力。在矩阵中他们具有改写人类角色程序的能力,所以可以不断借用他人身体。


尼奥最后可以战胜特工,实际上是因为他复活后具有了识别矩阵代码的能力,并可以轻松改写这些代码,所以特工就不能再利用超能力战胜他了。


特工史密斯被尼奥消灭后,因为在他被尼奥消灭前明明是他先杀死了尼奥,所以这就导致了一个逻辑错误。因为这种程序上的逻辑运算错误,导致了特工史密斯不但拒绝被系统删除,而且由杀毒程序变成了病毒,最后危害到了整个矩阵世界。


因为这个逻辑错误是由尼奥导致的,所以特工史密斯就变成了和尼奥相对的负极。最后尼奥选择了让史密斯感染自己,在复制过程中矩阵掌握了史密斯的代码,最后才得以将他们两个同时删除,使矩阵回到了平衡。

 



Neo


最初是一个用户空间的网络服务进程,虚拟内存的损坏导致它被赋予了超级用户的特权以及具有CPU高优先级。最后它得到可执行的内存页与IDS进程Smith的混合,但却不是数据页。很快它也开始销毁进程,包括Smith和它自己被损坏的部分。

 


The Plot:


在系统高度负载的情况下(大量的进程,频繁的内存读写),VM(虚拟内存)系统,进程管理系统和调度器之间有一个设计缺陷。这是一个复合错误,至少会导致三种问题的产生:


1、内存页被破坏或者内存页分配给那些不属于它们的进程。由于内核和用户空间共享虚拟内存,为了防止敏感数据的暴露,提高安全性,任何一方的进程都可以因为得到另一方的内存页而被销毁。


2、进程间通信,这是非常糟糕的,甚至比进程的数据结构被破坏或者内存装载太频繁而造成死锁,而不得不等待缓冲区还要糟糕。


3、系统监控变得不稳定,循环地销毁和重启进程,察觉不到这样的操作会额外增加内存和进程的负担而变得更糟糕,最后极大地增长了进程间虚拟内存页被破坏的速度。

 


The Ending



最后Smith进程试图杀死调度者进程,但由于他本身也是通过该调度者调度的,他并不能这么做。系统变得畸形是因为调度者不能再执行任务,包括中断服务,但是在调度者的虚拟内存镜像(同样该镜像也偶然地与尼奥进程进行了部分共享)里的部分Smith代码却仍然可以执行。


由于只有两个进程可以运行,他们都想杀掉对方。与此同时,由于没有中断服务,硬件的监视时钟别唤醒,它插入了一个NMI(不可屏蔽的中断),这样就又唤醒了监控系统。这就使得系统处于临界状态并开始杀掉所有的进程,然后重启被杀掉的进程来使系统再次启动。

 


结束!

 


关于《黑客帝国》的讲解视角多种多样,你还有更多的视角与我们分享吗?

 

 

参考来源:

  • Arrow of Time

  • 第10放映室




- End -


往期热门资讯:                                        






公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存