免费注册 查看新帖 |

Chinaunix

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

[中断] 请教一下,发生中断内核栈的切换。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-08 23:51 |只看该作者 |倒序浏览
对于X86架构来说,发生中断,可以进行切换,每个进程都有它的TSS(忘记了)大概就是
会有地方去初始化SP,就是设置了内核堆栈。

但是对于ARM架构来说,中断发生,硬件上并没有这个初始化sp_irq(或者说是sp_svc)这个动作。
在看了下中断发生的相关代码,也没有看到哪里有赋值的动作。

如果是在内核启动期间,设置好了sp_svc寄存器的值,给每个进程共用。
那就是内核堆栈的虚拟地址都是相同的?
进程切换会刷新页表,然后都会通过映射指向自己的内核堆栈...
那如果真的这样..应该还要保证进入和退出中断时候,sp_svc应该不要改变的?

是我疏忽了哪个地方?或者说是哪里理解错误。
望指点一二。
谢过~~

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
2 [报告]
发表于 2016-08-09 08:44 |只看该作者
本帖最后由 mordorwww 于 2016-08-09 08:45 编辑

同问 同问 同问
曾经设想在x86上也这样做,切换页表即切换进程内核堆栈

论坛徽章:
0
3 [报告]
发表于 2016-08-09 14:30 |只看该作者
...可是没人回复....回复 2# mordorwww


   

论坛徽章:
0
4 [报告]
发表于 2016-08-11 17:10 |只看该作者
中断在irq模式下发生,但它只停留短暂片刻,保留一些寄存器值后,很快就会被切到svc模式。
svc模式下的sp,已经在进程切换时被设置好了。也就是说,中断处理函数是在当前进程的kernel task上下文里被处理。

至于sp_irq,这个值在刚开机时被固定在某个位置(全局变量stacks)
  1. void notrace cpu_init(void)
  2. {
  3.     struct stack *stk = &stacks[cpu];

  4.     /*
  5.      * setup stacks for re-entrant exception handlers
  6.      */
  7.     __asm__ (
  8.     "msr    cpsr_c, %1\n\t"
  9.     "add    r14, %0, %2\n\t"
  10.     "mov    sp, r14\n\t"
  11.     "msr    cpsr_c, %3\n\t"
  12.     "add    r14, %0, %4\n\t"
  13.     "mov    sp, r14\n\t"
  14.     "msr    cpsr_c, %5\n\t"
  15.     "add    r14, %0, %6\n\t"
  16.     "mov    sp, r14\n\t"
  17.     "msr    cpsr_c, %7"
  18.         :
  19.         : "r" (stk),
  20.           PLC (PSR_F_BIT | PSR_I_BIT | IRQ_MODE),
  21.           "I" (offsetof(struct stack, irq[0])),
  22.           PLC (PSR_F_BIT | PSR_I_BIT | ABT_MODE),
  23.           "I" (offsetof(struct stack, abt[0])),
  24.           PLC (PSR_F_BIT | PSR_I_BIT | UND_MODE),
  25.           "I" (offsetof(struct stack, und[0])),
  26.           PLC (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
  27.         : "r14");
  28. }
复制代码

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
5 [报告]
发表于 2016-08-12 13:35 |只看该作者
newsfh 发表于 2016-08-11 17:10
中断在irq模式下发生,但它只停留短暂片刻,保留一些寄存器值后,很快就会被切到svc模式。
svc模式下的sp, ...


arm平台, 进程切换时内核栈是怎么切换的

论坛徽章:
0
6 [报告]
发表于 2016-08-12 16:11 |只看该作者
内核堆栈和硬件上下文切换通过switch_to来实现,真正切换的动作在__switch_to里
硬件上下文保存在thread_info的cpu_context数据结构里,__switch_to最主要的工作,就是将当前寄存器值保存到prev对应的数据结构里,并将next里的值load到寄存器中,这样完成硬件上下文的切换
相关代码精简如下:
  1. ENTRY(__switch_to)
  2. // 以下完成硬件上下文保存到prev中
  3.     add ip, r1, #TI_CPU_SAVE
  4.     ldr r3, [r2, #TI_TP_VALUE]
  5. ARM(   stmia   ip!, {r4 - sl, fp, sp, lr} )    @ Store most regs on stack
  6. THUMB( stmia   ip!, {r4 - sl, fp}     )    @ Store most regs on stack
  7. THUMB( str sp, [ip], #4           )
  8. THUMB( str lr, [ip], #4           )
  9. ...
  10. // 以下完成将next的硬件上下文load到寄存器里
  11.     add r4, r2, #TI_CPU_SAVE
  12. THUMB( mov ip, r4             )
  13.     mov r0, r5
  14. ARM(   ldmia   r4, {r4 - sl, fp, sp, pc}  )    @ Load all regs saved previously
  15. THUMB( ldmia   ip!, {r4 - sl, fp}     )    @ Load all regs saved previously
  16. THUMB( ldr sp, [ip], #4           )
  17. THUMB( ldr pc, [ip]           )
  18. ENDPROC(__switch_to)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP