ARM Linux启动手册说寄存器r0应为零。为什么寄存器r0应该是zer0?
http://www.arm.linux.org.uk/developer/booting.php
CPU register settings
r0 = 0.
r1 = machine type number discovered in (3) above.
r2 = physical address of tagged list in system RAM.
我浏览了arch / arm / kernel / head.S但是找不到原因。
答案 0 :(得分:2)
虽然我在Linux内核邮件列表中找不到任何引用,或者Linux源代码确认了这一点,但我推测这个值被用作ABI版本以便将来证明ABI。
内核的未来版本可能希望修改从引导加载程序传入的参数:可能需要新的参数用于某些新的CPU功能,或者需要稍微调整其中一个现有参数。
当从较旧的引导加载程序引导新内核时,这会出现严重问题:内核如何知道传入的参数是什么?我们可以尝试并强制执行新内核仅使用新的引导加载程序启动,但这会在转换期间引起相当多的头痛。 (引导加载程序由Linux内核团队以外的人员编写;并且经常在硬件中闪存,防止在某些情况下轻松升级。)
更好的解决方案是将寄存器r0
保留为ABI版本。目前,我们坚持认为r0
始终为0.如果ABI发生变化,r0
可以被提升一个。然后,未来的内核可以检查r0
以确定它正在引导的ABI版本,以及如何解释其他寄存器中的值。
答案 1 :(得分:1)
一致性和效率。由于将寄存器设置为零是常见操作,并且ARM通常在受约束的环境中使用,因此代码密度可能会有所改善。将寄存器设置为立即值的指令编码比将寄存器设置为另一个寄存器的值要长。这在实践中是否有很大的不同是另一个问题。