Linux kernel ARM Linux如何在head.S内核解压期间切换到Thumb2模式
在从主线读取4.15及更高版本的linux内核时,我遇到了一个问题。在arch/arm/boot/compressed/head.S中,我读过类似的内容Linux kernel ARM Linux如何在head.S内核解压期间切换到Thumb2模式,linux-kernel,arm,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 )
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中,它可以通过基本跳转到比当前PC地址低0x300偏移量的地址,将cpu切换到Thumb2模式。我还搜索了一些其他文章,其中一些使用“adr”或“xadr”切换到Thumb2模式
我的问题是:为什么CPU可以通过这种方式切换到Thumb2模式?使用“bx”有什么不同
我的问题是:为什么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
首先,在支持拇指的手臂上,将PC
设置为奇数地址将切换为拇指模式。我想你知道吗?其次,ARM PC总是比当前执行的指令早8个字节。所以子pc,pc,#3
就像在thumb2模式下转到下一条指令
但是,如果CPU已经处于thumb2模式(像cortex-M一样从引导模式启动),该怎么办<代码>BX在只有thumb模式的CPU上没有意义。AR_类
宏将Cortex-M CPU定义为无。对于Cortex-A CPU来说,定义为“无”
我看到过代码(我相信是U-Boot)中包含了两种模式下都要执行的指令。在thumb模式下,操作码为无操作,在ARM模式下,操作码为分支。特定的操作码在模式中具有不同的含义,但具有相同的二进制数
为什么总是一个很难回答的问题。可能ARM
sub
opcode在Thumb2中是无害的。另外,一些较旧的CPU可能不支持BX
您的想法是什么?为什么-我猜指令更少,寄存器没有损坏。。。看起来很奇怪。bx
不会改变寄存器(cpsr除外,cpsr会根据需要改变;blx
会改变lr
,但这不是OPs的建议)。此外,指令也不少。M_类有一个nop
,ARM有一个sub
。这与单个bx
指令一样密集。