作为“根技术砖家”,看到这两天的Windows蓝屏事件影响范围如此之广,忍不住写一篇小作文。大部分是技术内容,最后植入一点免费广告。
先简单说明操作系统的两个基本概念:内核态和用户态。这是操作系统运行的两个状态(更严格来说,应该是CPU的两个运行状态)。顾名思义,系统级的任务,操作系统内核,所有程序公用的代码等,运行在内核态;一般的应用程序,比如word,微信,浏览器,等等都运行在用户态。内核态的代码,可以执行CPU的特权指令,可以做任何事情。用户态的代码则只能运行CPU普通指令。这种架构,是计算机体系结构逐步演进和优化的结果。只有内核态的错误或BUG,才能引起严重故障,比如蓝屏(蓝屏还不是最严重的故障,最严重的故障,连蓝屏都没有,系统直接崩溃,数据全部丢失...)。用户态应用程序的故障,只会招致自身毁灭,被操作系统直接砍死(下图2)。应用程序想引发蓝屏,还真没这个能力。这也是内核态/用户态分离的主要原因:隔离用户级故障。
就Windows来说,各类硬件驱动程序,操作系统内核,网络,文件系统,等等系统级的服务,都运行在内核态。这一次蓝屏事件,根据披露的信息,就是CrowStrike的一次大规模更新中携带的一个驱动程序(csagent.sys)错误导致。CrowStrike是安全公司,为了对整个系统的网络通信/文件访问等进行监控,必须深入到内核态才能做到。在Windows操作系统中,深入内核态最常用的方法,就是写一个虚拟驱动程序加载到内核,这也是大部分安全类应用的常规实现方法。从名字上就可以看出来,这是CrowStrike在内核态的agent。
这样来看,这个事件与微软无直接关系,是CrowStrike代码质量不过关引起的。但Windows操作系统的两个架构层面的问题是引发这个事故的底层原因:1)把驱动程序代码放在内核态;2)驱动程序级的更新把控不严。
第一个问题,这就是所谓的“宏内核”架构,大多数操作系统都是这样做的,包括Linux,苹果,BSD,...。个人一直认为,宏内核是操作系统最优实现,它可以确保效率,用户编程简单等。但随着时代的发展,这种情况正在变化。这次蓝屏事件,或许是宏内核已不适应时代的表现。任何东西,有生命的还是无生命的,都是有生命周期的。与宏内核对应的,是微内核。在微内核架构中,驱动程序被踢出了内核态,放在用户态中进行实现。显然,如果是微内核架构,本次蓝屏事件不会出现,甚至都不会被人们感知到(csagent早被操作系统悄悄干死了)。
第二个问题,可以让驱动动态加载和更新,以适应硬件碎片化的问题,在攒机时代是必须的,我个人也一直认为这是是Windows架构优秀的表现,因为实现起来并不容易。随着一体化计算机成为主流,这个需求也逐渐消失。比如苹果,就不允许你去随意安装和更新驱动程序。这或许也是新时代来临,Windows逐渐不适应的表现吧。
新的时代到来了,Windows逐渐不适应了。那么,谁在新的时代里肩负起主流操作系统的职责呢?是hellox吗?哈哈,比较困难。广告来了:那就是---HarmonyOS NEXT!
鸿蒙操作系统,最新版本完全是微内核架构,机制上保证了不会出现大规模蓝屏事件。鸿蒙绝对不允许随意安装内核级驱动程序,甚至对用户态APP都有严格控制,上述两个问题完全解决。还在犹豫要不要适配的伙伴们,放心的开搞吧,这是时代的趋势:-)