[原创] 为什么要有 向量号?

在常规的远转移中,目标地址格式为: 

 

目标段Selector : 目标段内Offset 

 

在通过Gate(Call/Interrupt/Trap)的转移中,我们只负责提供Gate的Selector,然后由Gate Descriptor来提供目标段Selector和目标段内Offset,然后找到handler。 

 

为什么不采用常规的方式来找到handler呢?

 

我认为这其中的原因是 “通过多一层的间接来降低耦合,提高灵活度”。

 

试想,如果我们仍然采用常规的方式来为每一种中断/异常来定位handler,那么,硬件或者软件在产生每一种异常/中断时,必须提供handler的真实地址,这其实是“中断/异常的种类”和“对应handler地址”之间的紧耦合,如果handler的地址发生了变化,异常/中断源就会受到影响。 

 

而如果采用了中断向量号的做法,就切断了“中断/异常的种类”和“对应handler地址”之间的紧耦合,向量号其实就相当于一种透明指针。向量号把中断/异常的种类与handler地址联系了起来。

常规方式:(中断/异常)--------(handler) 

采用中断向量的方式:(中断/异常)--------(向量号)--------(handler)

 

有了向量号之后,就可以找到对应的Interrupt/Trap, 而handler的完整地址就在Gate中。 

 

类似的道理,Call Gate的存在,也是为了建立如下的三方关系: 

(调用的功能)--------(Call Gate Selector)--------(被Call的代码)

 

从上面不难看出, 向量号和Call Gate Selector的地位其实是等价的。 用户只需要关心向量号和Call Gate Selector这两个中间层的量,而最终被调用代码的位置,由OS负责布局。

 

这让我再次想起某人曾经说过的一句话:“计算机中的任何问题都可以通过一个中间层解决。”

posted on 2010-08-09 13:17  smwikipedia  阅读(163)  评论(0编辑  收藏  举报

导航