解压缩head.S中的内核时ARM Linux如何切换到Thumb2模式。

时间:2018-02-10 15:57:50

标签: linux-kernel arm

我在4.15及更高版本的主线上阅读linux内核时遇到了问题。在arch / arm / boot / compressed / head.S中,我读过类似的内容。

133: #ifndef CONFIG_THUMB2_KERNEL
134:    mov r0, r0
135: #else
136:    AR_CLASS(   sub pc, pc, #3  )   @ A/R: switch to Thumb2 mode
137:    M_CLASS(    nop.w           )   @ M: already in Thumb2 mode
138:    .thumb
139: #endif

第136行说明在Thumb2中,它可以将cpu切换到Thumb-2模式,通过基本跳转到比当前PC地址低0x300的地址。我搜索了其他一些文章,其中一些使用'adr'或'xadr'切换到Thumb2模式。

我的问题是:为什么CPU可以通过这种方式切换到Thumb2模式?与使用'bx'有什么不同?

1 个答案:

答案 0 :(得分:2)

  

我的问题是:为什么CPU可以通过这种方式切换到Thumb2模式?与使用'bx'有什么不同?

查看代码和评论......

136:    AR_CLASS(   sub pc, pc, #3  )   @ A/R: switch to Thumb2 mode
137:    M_CLASS(    nop.w           )   @ M: already in Thumb2 mode
138:    .thumb

首先,在支持Thumb的ARM上,将PC设置为奇数地址会切换到拇指模式。我猜你知道吗?其次,ARM PC总是比当前正在执行的指令早8个字节。所以sub pc, pc, #3就像转到 thumb2 模式中的下一条指令一样。

但是如果CPU已经处于thumb2模式(从像cortex-M一样启动)会怎么样? BX在只有拇指模式的CPU上没有意义。 AR_CLASS宏定义为Cortex-M CPU没有任何内容。 M_CLASS定义为Cortex-A CPU没有任何内容。

我见过代码(在U-Boot中我相信),其中包含了在两种模式下执行的指令。在 thumb 模式下,操作码是无操作,在ARM模式下,操作分支。特定操作码在模式中具有不同的含义,但具有相同的二进制数。

为什么始终是一个难以回答的问题。也许ARM sub操作码在Thumb2中是无害的。此外,某些较旧的CPU可能不支持BX