何意味了。
一些胡扯。显然我并没有非常深入的实现过操作系统。但下面的东西是一个愿景。
最近爆出了 copy fail 漏洞。触发方式可谓非常简单,代价极小而效力极大。
不禁让人想起了融解/幽灵漏洞(meltdown/spectre)。虽然类型不同,但同样是威胁重大的安全漏洞。
Linux 内核似乎不断地在爆出各种漏洞。一个重要的原因是代码量的庞大。
庞大的代码量必然孕育一些 bug。而且在 Linux kernel 这种规模上,bug 的数量更会超线性增长。原因很简单:已经没有任何人能够完全掌握整个项目的每个细节。
于是,“Tests can only prove the presence of bugs, but never the absence of them.”。
所以,减少漏洞的一个好方法是减少代码量。比如早期 Unix 仅有几千行 C 代码,现在用 rust 可以更少。在如此少的码量中,“眼睛足够多,虫子无处藏”,经过充分的审阅,可以让 bug 几乎被消灭。
更重要的,足够简洁的代码可以动用形式化验证方法。就像 SeL4 那般。
有一种有趣的方法可能实现这一目标。
众所周知,过去的三十年里我们付出了巨大的努力,来欺骗每个应用它们独占一台计算机器。
那么不如做人做到底,给每个应用一台虚拟机。
在这个“Vindows”架构上,机器运行一个 hypervisor。它的代码非常精简,因为 hypervisor 只需要划分资源,而不提供复杂的管理。它提供机制而非策略。
其上运行着许多虚拟机,其中一个拥有特权,名为“管理分区”。
管理分区起到提供策略的作用。它可以与 hypervisor 通信,要求改变资源划分。
其他每个虚拟机中运行着一个定制的微型内核,所谓 unikernel 模式。这个内核的唯一作用是为其中运行的一个应用提供支持。
就像现在的程序语言运行时。
每个应用都以为它运行在完整的一台机器上。
这并非空穴来风。事实上,Azure,GCP,AWS 等云平台已经采用了这样的方案。Windows 在 10 以后也开始采用类似的机制。
优势简单而明显。
首先,安全层面上,这可以防御几乎所有除了侧信道之外的攻击。而且大幅提升侧信道攻击的难度。
其次,这可以降低上下文切换的开销。在这样的系统里,不需要划分 ring0/ring3 权限环。系统调用和普通函数调用一样飞快,昂贵的上下文切换会大大减少。
能够定制专门的文件系统,跑的飞快,同时不受制于 NTFS 这种脑瘫,不需要经过过滤器,不需要审查,也没有杀毒软件。
没有程序能污染全局配置。
可以方便的进行热更新,管理分区的更新不必重启所有应用。
虚拟机内的多线程/多进程,以及进程间通信能大大加速。
甚至内存占用都能减少。unikernel 的占用可以做到几 MB,远小于目前常用的 web 技术。本质上,chromium 就是一个很庞大的操作系统。
外加 KSM 这样的技术,利用虚拟内存,可以合并同样内容的内存页。以此减少相同的库产生的额外占用。
可以进行内存分段,给每个 VM 分配一段。这能够进一步阻止侧信道攻击的可能性。
最重要的是,这是渐进式摆脱 Windows 现有的沉重历史包袱的唯一途径。
自然也有挑战。最浅显的挑战是侧信道攻击,但是内存分段,KPTI,更新硬件等大概能防住。
另一个挑战是图形用户界面。想象一下如何进行桌面窗口管理?如何在特定界面进行鼠标和键盘操作?挺困难的。
可能的方向也许是利用 SR-IOV 技术,让每个 VM 都能直接看到显卡的一个“切片”(虚拟 GPU)。应用 VM 直接在显存里画图,管理分区只负责告诉显卡:“现在把 VM-A 的层放在 VM-B 的上面”。
这样性能能保住,但显卡驱动的安全性又成了新的挑战。
驱动是最终大 BOSS。Linux 之所以臃肿,对种种神秘硬件的兼容,还有各种驱动占了绝大部分。unikernel 或管理分区要简洁优雅的管理这些东西是个巨大的挑战。
我们可能仍然难以避免在管理分区塞进一个 NT 或 Linux 内核。不过,优势是这些内核可以被精简。比如去除多用户管理。
另一个困难发生在资源回收时,尤其在内存回收时。如果强行咔嚓掉 VM 的内存,可能 VM 会当场崩掉。
已有一些成熟的策略,比如近乎于协同式资源调度的气球策略。或者,我们可以借鉴传统的换页方式。管理分区首先向 VM 发出信号代表调整资源配额,随即换页。而 VM 自己决定如何调整策略。
还有 VM 间通信。理想状况下不会有很多 VM 间通信。但非常可惜的是,虽然服务器的确如此,桌面端却不一定。剪贴板与文件共享,都是典型的进程间通信(在这里是 VM 间通信)需求。
这个东西难以处理。Qubes OS 用了一些方法,不过 UX 欠佳。
文件共享和内存共享是究极难题了,最后我们会面临一份文件多次复制在磁盘里,以及一个库在内存里存多份的问题。我们可能需要 KSM,甚至引入虚拟磁盘才能解决这些问题。但虚拟磁盘会极大增加复杂性和性能损耗,而 KSM 会产生很多侧信道攻击。
性能,特性强大程度,隔离性,简洁性……不可并存,有点恼火
确实如此,每个 worse is better 背后都是世界的本质复杂度。Vindows 也不例外:它已经被实现在了适合的地方,并且没有被实现在不适合的地方。
解决这些问题的最简单方式是不解决:chrome 和 electron 不也很流行吗?:P
无论如何,上面的东西都是愿景,我们暂时不谈论困难。