免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1973 | 回复: 2
打印 上一主题 下一主题

关于arm中断代码中的堆栈 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-29 11:50 |只看该作者 |倒序浏览
下面这段代码是从entry-armv.s中的摘抄的,其中vector_\name后进入的是中断的通用代码

  1. .macro vector_stub, name, mode, correction=0
  2.              .align 5
  3.         vector_\name:
  4.              .if \correction
  5.              sub lr, lr, #\correction
  6.              .endif
  7.              @
  8.              @ Save r0, lr_ (parent PC) and spsr_
  9.              @ (parent CPSR)
  10.              @
  11.              stmia sp, {r0, lr} @ save r0, lr
  12.              mrs lr, spsr
  13.              str lr, [sp, #8] @ save spsr
  14.              @
  15.              @ Prepare for SVC32 mode. IRQs remain disabled.
  16.              @
  17.              mrs r0, cpsr
  18.              eor r0, r0, #(\mode ^ SVC_MODE)
  19.              msr spsr_cxsf, r0 @为后面进入svc模式做准备
复制代码

我不太明白的是这句 stmia sp, {r0, lr} @ save r0, lr , 按照arm手册上说stmia操作后相应的寄存器地址向上增长,而Linux内核的堆栈是向下增长的。
请求高手指点。

论坛徽章:
0
2 [报告]
发表于 2009-08-29 15:01 |只看该作者

回复 #1 xiaozhe2000 的帖子

找到原因了,原来exception mode时用的堆栈和内核用的不一样,exception mode用的栈在cpu_init() 时被初始化:

struct stack {
        u32 irq[3];
        u32 abt[3];
        u32 und[3];
} ____cacheline_aligned;

static struct stack stacks[NR_CPUS];

论坛徽章:
0
3 [报告]
发表于 2009-08-30 00:16 |只看该作者
lz看得很仔细
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP