darling54454 发表于 2016-08-08 23:51

请教一下,发生中断内核栈的切换。

对于X86架构来说,发生中断,可以进行切换,每个进程都有它的TSS(忘记了)大概就是
会有地方去初始化SP,就是设置了内核堆栈。

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

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

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

mordorwww 发表于 2016-08-09 08:44

本帖最后由 mordorwww 于 2016-08-09 08:45 编辑

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

darling54454 发表于 2016-08-09 14:30

{:yxh17:} ...可是没人回复....回复 2# mordorwww


   

newsfh 发表于 2016-08-11 17:10

中断在irq模式下发生,但它只停留短暂片刻,保留一些寄存器值后,很快就会被切到svc模式。
svc模式下的sp,已经在进程切换时被设置好了。也就是说,中断处理函数是在当前进程的kernel task上下文里被处理。

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

    /*
   * setup stacks for re-entrant exception handlers
   */
    __asm__ (
    "msr    cpsr_c, %1\n\t"
    "add    r14, %0, %2\n\t"
    "mov    sp, r14\n\t"
    "msr    cpsr_c, %3\n\t"
    "add    r14, %0, %4\n\t"
    "mov    sp, r14\n\t"
    "msr    cpsr_c, %5\n\t"
    "add    r14, %0, %6\n\t"
    "mov    sp, r14\n\t"
    "msr    cpsr_c, %7"
      :
      : "r" (stk),
          PLC (PSR_F_BIT | PSR_I_BIT | IRQ_MODE),
          "I" (offsetof(struct stack, irq)),
          PLC (PSR_F_BIT | PSR_I_BIT | ABT_MODE),
          "I" (offsetof(struct stack, abt)),
          PLC (PSR_F_BIT | PSR_I_BIT | UND_MODE),
          "I" (offsetof(struct stack, und)),
          PLC (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
      : "r14");
}

mordorwww 发表于 2016-08-12 13:35

newsfh 发表于 2016-08-11 17:10 static/image/common/back.gif
中断在irq模式下发生,但它只停留短暂片刻,保留一些寄存器值后,很快就会被切到svc模式。
svc模式下的sp, ...

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

newsfh 发表于 2016-08-12 16:11

内核堆栈和硬件上下文切换通过switch_to来实现,真正切换的动作在__switch_to里
硬件上下文保存在thread_info的cpu_context数据结构里,__switch_to最主要的工作,就是将当前寄存器值保存到prev对应的数据结构里,并将next里的值load到寄存器中,这样完成硬件上下文的切换
相关代码精简如下:ENTRY(__switch_to)
// 以下完成硬件上下文保存到prev中
    add ip, r1, #TI_CPU_SAVE
    ldr r3,
ARM(   stmia   ip!, {r4 - sl, fp, sp, lr} )    @ Store most regs on stack
THUMB( stmia   ip!, {r4 - sl, fp}   )    @ Store most regs on stack
THUMB( str sp, , #4         )
THUMB( str lr, , #4         )
...
// 以下完成将next的硬件上下文load到寄存器里
    add r4, r2, #TI_CPU_SAVE
THUMB( mov ip, r4             )
    mov r0, r5
ARM(   ldmia   r4, {r4 - sl, fp, sp, pc})    @ Load all regs saved previously
THUMB( ldmia   ip!, {r4 - sl, fp}   )    @ Load all regs saved previously
THUMB( ldr sp, , #4         )
THUMB( ldr pc,          )
ENDPROC(__switch_to)
页: [1]
查看完整版本: 请教一下,发生中断内核栈的切换。