我在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'有什么不同?
答案 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
。