加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – ARM如何在IRQ处理程序中切换到svc模式?

发布时间:2020-12-14 00:04:50 所属栏目:Linux 来源:网络整理
导读:以下代码片段取自 linux v2.6.11. v3.8中也存在类似的东西. mrs r13,cpsrbic r13,r13,#MODE_MASKorr r13,#MODE_SVCmsr spsr_cxsf,r13 @ switch to SVC_32 modeand lr,lr,#15ldr lr,[pc,lsl #2]movs pc,lr @ Changes mode and branches 查看实际文件的以下链
以下代码片段取自 linux v2.6.11. v3.8中也存在类似的东西.

mrs     r13,cpsr
bic     r13,r13,#MODE_MASK
orr     r13,#MODE_SVC
msr     spsr_cxsf,r13                  @ switch to SVC_32 mode

and     lr,lr,#15
ldr     lr,[pc,lsl #2]
movs    pc,lr                          @ Changes mode and branches

查看实际文件的以下链接:
http://lxr.linux.no/linux+v2.6.11/arch/arm/kernel/entry-armv.S

我认为写入CPSR的模式位可以改变当前的ARM模式.但是如何写入SPSR(而不是CPSR)导致切换到SVC_32模式?

(或)在最后一条指令“movs pc,lr”中发生了什么.有人能帮我理解吗?

解决方法

带有’S’后缀的mov或sub指令以及程序计数器作为其目标寄存器意味着异常返回.

它将SPSR的内容复制到CPSR,并将源寄存器的值移动到程序计数器(在本例中为链接寄存器).

在您的示例中,这有效地将模式设置为SVC模式并一次性从函数返回.

在ARM reference manual中有更多相关信息.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读