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

为什么arm-linux-gcc在进入IRQ模式时只保留r0-r4

发布时间:2020-12-14 01:49:36 所属栏目:Linux 来源:网络整理
导读:我正在使用基于ARM cortex-A8的S5PV210 当我声明这样的中断例程时: void isr_routine(void) __attribute__ ((interrupt ("IRQ"))); 并像这样编译 arm-linux-gcc -c -march=armv7-a -fpie -fno-builtin $ -o $@ 我知道gcc会通过推送一些寄存器为我切换上下文
我正在使用基于ARM cortex-A8的S5PV210

当我声明这样的中断例程时:

void isr_routine(void)  __attribute__ ((interrupt ("IRQ")));

并像这样编译

arm-linux-gcc -c -march=armv7-a -fpie -fno-builtin $< -o $@

我知道gcc会通过推送一些寄存器为我切换上下文.在我知道这一点之前,我手动完成了.所以我很好奇gcc是如何做到的.
拆解后,我找到了如下代码

PUSH     {r0-r4,r11,r12,lr}

这与我关于如何切换上下文的概念背道而驰.
在Arm cortex-A8官方文档中,明确表示r0-r12由用户模式和IRQ模式共享.但是用户模式中的lr独立于IRQ模式.所以,我曾经像这样切换上下文

PUSH     {r0-r12}

可以吗?为什么gcc推送lr注册,为什么gcc不推r5-r10 rigsters?

解决方法

r4-r11作为ARM ABI的一部分保留在函数调用中,因此除非函数本身要破坏它们,否则中断例程不需要保存它们.如果中断例程调用的另一个函数想要修改这些寄存器,则它已经有义务将它们保存并恢复为正常ABI的一部分.似乎在这个集合中,编译器只想使用r4和r11(不使用r5-r10).

虽然非权威,维基百科的文章很容易阅读,可能会有所帮助:http://en.wikipedia.org/wiki/Calling_convention#ARM

(编辑:李大同)

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

    推荐文章
      热点阅读