[原创] 为什么要有 向量号?
在常规的远转移中,目标地址格式为:
目标段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) 编辑 收藏 举报