为什么Amiga库有负面的入口点?

2021-02-24 17:12

如这些答案所述,AmigaOS库中包含的函数的跳转表偏移量始终为负值。这样做的原因对我来说并不直观,但我怀疑Carl Sassenrath有很好的理由这样做(而不是仅仅使用

解答动态

  • TL;DR: 通过将这些偏移量设置为基址的负值,可以获得什么功能或方便?
    它提供了对两个列表的简单访问,这两个列表可以在将来的版本中用一个指针扩展。
    长阅读: A单曲指针只能指向一个内存位置(是的,听起来很明显,但请留下来)。所以乍一看,指针只能指向一个数据结构。对于Amiga库,它是描述库及其用法的库结构。
    但是要访问函数,需要有第二个数据结构来保存入口点(直接或作为地址(*1))。添加入口点/跳转表等内容的两种传统方法是:在库结构之后定位所有入口点并使用从那里开始的偏移量打开。添加一个指向库结构的入口点表的指针,并使所有相对于该地址的偏移量。 1解决方案会使结构的任何扩展变得相当困难,因为每次操作系统更改/扩展头时,它都会更改函数的偏移量。对于向上兼容的库系统不是一个好主意。
    解决方案2是大多数操作系统(包括Windows)使用的解决方案之一。它避免了版本依赖的陷阱。另一方面,它附带了一条额外的指令(其实不是什么大问题)和两个指针的用法。一个用于标识库,另一个用于处理入口点表。这看起来并不多,正如前面提到的,许多操作系统确实是这样做的,但Amiga操作系统却不是这样。他们确实采用了第三种方法:在两个方向上使用地址空间的一维特性。想想看,记忆是(不是真的)无限的记忆细胞序列,不仅可以向上,而且可以向两个方向移动。用一个指针实现两个结构的寻址-只要它们背对背。
    要查看效果,请看一看RichF在上述问题的答案中已经给出的漂亮图片问题:
    使用在两个方向上的一维性质提供了几个优点。
    这两种结构都可以以新的形式生长无需侵入的版本可以使用新的库版本添加新的入口点库结构可以针对较新的OS版本进行扩展无需为跳转表计算第二个指针无需处理两个指针(库和入口表)关于该库的所有内容只有一个指针1最后一个点不能强调够了。一个指针就是该库的所有用户需要。不程序员将有机会使用错误的一个它为加载的库 创建一个唯一的标识符当然这只适用于允许负偏移量的ISA-方便的是68k正是这样做的:)说到68k:
    中没有目标地址的间接跳转memoryRegister间接加(负)偏移量JSR的18时钟速度与绝对JSR一样快行:当优点可能看起来很小,但在系统设计的简单性方面,它们帮助很大,可用性和向上性兼容性。和所有这些都没有任何缺点(在68k. *1上),这里要记住Amiga是一台相当慢的机器。以今天的标准来看,慢得令人难以置信。每个周期都很重要。同时,Amiga OS试图尽可能的干净和清晰。

    • End

    免责声明:

    本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。