.. Kenneth Lee 版权所有 2021
:Authors: Kenneth Lee :Version: 1.0
这个文档我们来讨论一个技术标准本文写作中很容易犯的错误。
比如,我们会说:
| XXX特性可以计算数据报文的校验和。
这是人类腔,或者更确切一点,这是“人类总结腔”,这个东西可以形成一个“恍惚”,我们 大概可以知道它是什么,但要说基于这句话写程序,那是不可能的。这只是一种总结,总 结可以写,但认为写了总结,你就定义了一个标准,这就不对了。
要能写程序,你需要的是“机器腔”,或者更确切一点说,应该叫“机器定义腔”:
| 当get_capa() & CAPA_XXX为真的时候,XXX特性被使能。当XXX特性被使能的时候,
| get_xxx_checksum()函数结果有效。get_xxx_checksum()结果有效时,它的功能
| 如下……
这是可以用于写出程序的。
这是“名可名,非常名”这个游戏的有趣之处。前面这个定义,总结起来,也是“说明XXX特 性的功能”,后面这个总结起来,也是“说明XXX特性的功能”,你和别人交流,要总结性地 说这两件事,说出来的“总结”都是一样的,但你说的不是同一件事。所以,“名”确实“可名 ”,但确实也“非常名”。后面这个叫“坐进此道”。拿着扫把的人才是扫地,总结“扫地”的人 不在扫地。但这个事情本身是个层层递进的关心,后面做这个定义的人,也不是在实现 get_capa这个函数。
但如果我们要“定义”XXX特性的规范,后面这个机器腔,才是我们需要定义的。
| The basis for the Sv32 family' translation is 4KB base pages.
| To trun on this feature....
这是一个总结性的定义,是人类腔。我们大概可以猜出4KB base pages是什么意思,但它 并不严格。不能用于层层递进。
| Sv32 implementation support a 32-bit virtual address space,
| divide into 4KiB pages. An Sv32 virtual address is partitioned
| into a virtual page number (VPN)...
这是机器腔,一层层过去的:虚拟地址是32位的,虚拟地址分成VPN,VPN又是巴拉巴拉的 。这严格限定了范围。
还有这样的:
| 全局变量GLOBAL_XXX_CFG必须设置成非零值。
“必须”,这是人的思维,不“必须”咋地?你打我?
机器不是这样的,机器的思维是:
| 系统复位后,GLOBAL_XXX_CFG为0。系统预期,在调用任何xxx_前缀的函数前,
| GLOBAL_XXX_CFG会被设置为非零值,否则这些函数都会抛出异常
| EXCEPTION_CFG_NOT_SET。
还有这样的:
| Sv32 is a 3-Level page table.
这是总结,就算它是3级页表又怎么样呢?我程序该怎么写?我程序想知道的是:
| In Sv32 mode, the virtual address is defined as follow...
里面有两个VPN加一个offset,这就是3级页表,但3级页表是总结,不能用于支持写程序, 你还是要告诉我VA是什么样的。
下面这个例子不是机器腔的问题,但仍和进行标准定义有关系,比如:
| CPU和XXX协处理器是一对一的映射关系。
这是人为总结的思路,我们实现一台机器的时候,确实准备给每个CPU都加上一个XXX写处 理器,但这不是描述机器的思路,因为你不能说我不能在系统中为了特定的目的增加一个 没有XXX协处理器的CPU吧?
所以更接近机器思维的描述是这样的:
| 每个capa位中有XXX位的CPU,都有独立的XXX协处理器实体与之对应。
这两种表述的主要不同是限制的范围不同。前一种表述限制了系统中所有的CPU,而这种限 制明显是无收益的(你非要制造一个收益我没话说,如果那是你的意图,那就这样定义吧 ),后一个是个明显每点限制,都对准了我们的收益的:我不在乎你有多少CPU,但如果你 声明了你有XXX的capability,你就给我放在XXX协处理器进去。
我们继续沿用这个协处理器(为了讨论方面,我们把它简称做COP)的例子。有人会喜欢这 样的定义:
| COP定义了32个寄存器,可以被CPU直接访问。
这是人天然的感觉,因为我们就是觉得协处理器和CPU是两个相互独立的实体,协处理器有
32个寄存器,通过CPU的指令\ cop_move eax, cop_r0
\ ,这不是不是很自然让CPU去“操
作协处理器了吗?”
但显然这不是机器的感官,机器的感官是,你用\ cop_move exa, cop_r1
\ 和普通的
move eax, ebx
\ 这两个行为本质上不都是CPU的指令吗?怎么前者就变成CPU去控制写处
理器呢?
所以,正确的说法应该是:
| COP包含了32个寄存器,可以通过专用的CPU指令进行访问。
这看起来只是个“说法”上的不同,但其实概念空间发展了就会不一样。因为当我们认同了
是\ cop_move
\ 是一个CPU的指令,我们也认同了我们对CPU指令的所有假设,比如中断
的时候,\ cop_move
\ 是可以被打断的。但如果我们认为cop_move是CPU发给COP的一个
内部指令,那么是否可以打断就要单独说了。正确认清“你我”,是我们正确描述有
“自由度”的“严格设计”的关键。