Arm 为什么是;ldr pc,[pc,#imm]”等;凭经验不可预测

Arm 为什么是;ldr pc,[pc,#imm]”等;凭经验不可预测,arm,thumb,Arm,Thumb,THUMB2引用指定如果目标地址不是4字节对齐的,则LDR PC、[PC,#imm](类型2)是不可预测的 根据我的经验,在一些处理器上,这工作得非常好,而在另一些处理器上,它失败得很惨(这就是为什么我花了很长时间才将故障追溯到这个对齐问题) 因此,我想知道是否有一些真正的解释(除了“不要这样做”)。主要原因(我认为)是加载PC或SP的指令有副作用,并且很难在CPU中(有效地)管理。由于ARM指令集,较新的指令集(包括Aarch64)限制了具有这些副作用的指令。像这样的ARM语言通常意味着在过去

THUMB2引用指定如果目标地址不是4字节对齐的,则LDR PC、[PC,#imm](类型2)是不可预测的

根据我的经验,在一些处理器上,这工作得非常好,而在另一些处理器上,它失败得很惨(这就是为什么我花了很长时间才将故障追溯到这个对齐问题)


因此,我想知道是否有一些真正的解释(除了“不要这样做”)。

主要原因(我认为)是加载PC或SP的指令有副作用,并且很难在CPU中(有效地)管理。由于ARM指令集,较新的指令集(包括Aarch64)限制了具有这些副作用的指令。

像这样的ARM语言通常意味着在过去或现在的某个时候,它们有一个特定的核心,而该核心不起作用。所以不要这样做。可能与你的核心工作得很好。它可能与指令集有关,也可能与指令集无关,只要他们愿意,不管是否对齐,只要放下门,就可以使指令工作。这就是为什么一个或多个特定的实现很可能存在问题,并且在发现问题之前已经发布了

在使用ARM的旧时代,可能仍然是这样,当他们专门实现了一些事实上可以预测的东西时,他们使用这种语言,并将其作为一种方式来查看您是否使用了被盗代码或其他东西。如果你克隆了一只手臂,那该怎么办。我想皮科图博差不多把它盖上了,然后把它放在床上。ARM的法律团队现在对此做了简短的工作

特别是程序计数器有点凌乱,尤其是管道,前面的两个东西现在都合成了,可能是从橡子时代开始的。一般来说,在逗号右侧使用pc是一个坏主意,除了特殊情况(pc相对负载、跳转表等),因此您可能会看到这种与pc相关的语言,这样他们就不必添加代码和时钟周期,使该指令只与右侧的pc一起工作。在这种情况下(pc相对负载),他们可能有一个或多个相互剪切和粘贴的实现,这些实现有问题,或者出于性能、门计数或定时关闭的原因,他们制定了此规则。定时关闭,您的设计运行速度只能与帐篷中最长的杆一样快,最长的时间组合信号用于解决制造和温度以及其他环境因素加上裕度的覆盖变化。所以,在你们计算这些之前,先检查它们,然后决定,我们是否要把它分成两个或更多的时钟,它是否与一个特定的功能相关联,我们是否要删除这个功能。重复合成和定时关闭,直到您预期的最大时钟频率达到或高于您对本产品的预期

也可能是他们没有捕获未对齐的访问在这种情况下,非4字节对齐是一种未对齐的访问,并且他们可能没有正确地实现它,假设它会被捕获,或者谁知道为什么。你可以试试看。通过在未对齐的地址的任一侧获取或植入特定字节,然后在可能到达的位置的组合处植入代码。除非你是一个芯片供应商,否则你不可能看到这一点(如果它没有陷阱),作为一个芯片供应商,你将能够模拟这一点,并确切地看到发生了什么,当然你也会有代码,并确切地看到为什么它不工作,如果你有一个不工作

查看早期的ARM(ARMv4T/ARMv5T和一些ARMV6),它在LDR上更为通用,[,]

如果内存地址没有字对齐且没有发生数据中止,则写入目标寄存器的值是不可预测的

甚至不使用PC作为一个或多个寄存器

TL;DR.很可能这是两件事中的一件,1)他们至少有一个内核有缺陷,在同一系列或其他设计的后续内核中修复。2) 他们有一个设计原因(通常是时间/性能),这使得实现未对齐的访问并允许它产生垃圾是不可取的,这可能不是不可预测的,但不值得对结果进行冗长的解释,因为它无论如何对您没有帮助


仅仅因为它在一个核心上为您工作了一次并不意味着它总是工作的,您可能会幸运地得到有问题的代码和核心。如果您可以访问勘误表,您可以找到原因和修复的答案。从ARMv4T到现在,所有arm内核都支持Thumb,其中许多内核都是从头开始做的,因此,仅仅因为您在一个勘误表中找到了修复,并不意味着其他设计依赖于文档中的说明“不要这样做,不要费心让它工作”。

如果它不是4字节对齐的,即使可能,内存访问也可能需要多个周期。Esp,如果系统没有缓存(cortex-m,仅支持thumb2)。填充到4字节对齐PIC数据相当容易。因此,一些ARM/Thumb2系统可能在设计时无法进行未对齐的内存访问。晶体管计数和管道将简化。thumb2组装技术可以处理所有情况,并为CPU/SOC设计人员提供了一些灵活性。感谢您的快速响应,但我还没有完全理解。如果目标寄存器不是
pc
,为什么地址不对齐就可以了?另外,你能推荐一些关于ARM内部工作原理的阅读材料吗?可能只是我遗漏了一些信息。我要强调的是,我不是在寻找解决方案(因为这相当简单),我只是想了解这个问题。
PC
非常特殊,因为它需要在哪里获取下一条指令。如果
ldr
未对齐,则需要/可能需要多总线/内存周期,并且您需要一些信息来告诉C