Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel ARM Linux如何在head.S内核解压期间切换到Thumb2模式_Linux Kernel_Arm - Fatal编程技术网

Linux kernel ARM Linux如何在head.S内核解压期间切换到Thumb2模式

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 )

在从主线读取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中,它可以通过基本跳转到比当前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
指令一样密集。