2011-10-16 36 views

回答

1

一致性和效率。由于将寄存器设置为零是一种常见操作,ARM通常用于受限制的环境,因此代码密度可能会有所提高。用于将寄存器设置为立即值的指令编码比将寄存器设置为另一个寄存器的值要长。这是否会在实践中造成很大的不同,这是另一个问题。

+0

ARM没有一个有效的异或操作? – bdonlan

+0

不过,我不清楚。你能否详细解释一下。 A)如果寄存器未设置为零,会产生什么不同。 b)有15个寄存器,但为什么只有r0? – user997487

+0

好吧,如果代码假设r0为零且不是,那么程序的行为将是未定义的。我没有写ABI规范。我认为它没有任何架构上的必要性 - 但一旦建立起来,就会陷入惯例。 –

2

尽管我在Linux内核邮件列表或Linux源代码中找不到任何参考文件来证实这一点,但我会推测这个值正在被用作ABI版本,以用于将来验证ABI。

未来版本的内核可能希望修改从boot-loader传入的参数:某些新CPU特性可能需要新参数,或者需要稍微调整一个现有参数。

从较旧的boot-loader引导新内核时,会出现严重问题:内核如何知道传入的参数?我们可以试着强制新的内核只能使用新的引导加载程序启动,但是在过渡期间这会导致很多头痛。 (引导加载程序是由Linux内核团队以外的人员编写的;并且也经常闪存深入到硬件中,以防止它们在某些情况下被轻易升级。)

更好的解决方案是将寄存器r0保留为ABI版本。目前,我们坚持认为r0始终为0.如果ABI发生变化,r0可能会提高一个。未来的内核然后可以检查r0以确定正在引导的ABI版本,并且因此如何解释其他寄存器中的值。

相关问题