.. Kenneth Lee 版权所有 2023
:Authors: Kenneth Lee :Version: 0.1 :Date: 2023-04-06 :Status: Draft
架构设计和一般设计的区别
之前的很多讨论,我都认为架构设计和一般设计仅仅是“量”或者“度”的差别,没有质的差 别。但最近连续做了几个基础概念空间的建模,我突然意识到架构设计和一般设计还是有 “量变到质变”的区别的。我通过本文记录一下这个心得。
最近做了一个新的虚拟化下的特权级方案设计。设计人员提供了很多的设计细节,我参与 了几次讨论,提供了一些意见以后,就总觉得哪里都不对劲。最后我忍不住做了一次架构 建模,在做这个建模之前,我也不知道我需要什么,但建出来以后,我发现我补充了这些 内容:
对比了我们的特权级设计和其他已有的一些设计的区别,找出了我们的关键变化,然 后在概念上推理:改变以后,原来的行为,现在应该怎么说。我还推理了为什么增加 新的特权级解决新需求,而不是通过增加相同特权级的不同实例去解决这些问题。
推理了在Type1虚拟化方案和Type2虚拟化方案下的行为,在我们这种特权级下是否仍 成立,哪些部分被放弃了。
推理了Nested虚拟化的情况下,原来的实现方案是否仍可以被实现。
实际上,在早期的版本上,我们甚至没有打算支持Nested虚拟化,但没做这个推理,我心 底下就是觉得不安全,现在想来,核心原因就是我不知道我们的细节补充的限制是什么。 如果我推过Nested方案对我们设计的限制,我就能控制加细节的时候,不要去触碰这些限 制,但如果没有推过,就算细节添加的过程一路畅通,我心底上也觉得不安全,因为我不 知道那个细节依赖导致我后面根本做不了Nested虚拟化了。
这种问题,通常就不是“设计”的时候考虑的,而是“架构设计”的时候考虑的。所以“架构 设计未来”,这算是一个例子了。
但这不是我要讨论的“质变”,质变的地方是:架构设计阶段的时候,我基本上都需要做全 可能性穷举。比如,别人选择4个特权级,我选择8个,我为什么要选8个?我得到了什么, 放弃了什么?为什么是8个而不是7个?不是6个?为什么要增加新的特权级,而不是增加 就特权级的不同实例?……这是穷举式的考量。只有架构设计这层抽象我能做这样的穷举, 一方面是因为这层选择的重要性允许我付出这样的时间,另一方面是因为这层概念比较简 单,我容易做所有可能性的穷举。到了细节设计阶段,你不可能再去做这种推理了,因为 那个可能性太多了,穷举不完。
所以,从这个角度说,架构设计和普通设计是有质的差别的,架构设计是通过一些手段, 特别是概念空间建模的手段,穷举所有设计的可能性,最大限度消除未来逻辑冲突风险的 手段,而设计,一般不可能做全量的穷举,而是根据构架设计定义的概念空间,选择其中 一种可能性,解决每个具体的问题。
作为量变到质变的例子,让我补充一些增加特权级导致如何改变CPU的特权级的结构的: 当你只有3、4个特权级的时候,特权级是个“层”的结构,错误可以一层层汇报,如果你把 特权级变成8个的时候,特权级就不能继续是个层的结构了,它必须是个“树”的结构,这 样才能保证报告距离足够短,而且保证状态机的复杂度足够低。这种变化,只有构架设计 的概念空间建模,才会发现和规范,如果我们没有这一级建模,只是顺延原来的量变,增 加更多的层级,这个方案从一开始就会有问题,那么补充足够的细节后,整个方案就要重 建了。