微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM Linux系统中的用户栈与内核栈

ARM Linux系统中的用户栈与内核栈

时间:11-09 来源:互联网 点击:

切换的时候所看到的寄存器内容都是不同的。Linux对于各种模式的使用策略是:SVC和USR两种模式是可以稳定工作的模式;在其它的模式下都是不稳定的,会尽快切换到稳定的模式去工作。在SVC模式下,SP寄存器总是指向内核栈;在USR模式下,SP寄存器总是指向用户栈;那么,其它模式下,SP又指向哪里呢?

其它模式下,Linux对于SP寄存器的维护很简单。在系统启动阶段,cpu_init()函数会被调用,其中有对其它模式下SP寄存器的初始化操作:

[c]struct stack {u32 irq[3];u32 abt[3];u32 und[3];} ____cacheline_aligned;static struct stack stacks[NR_CPUS];void cpu_init(void){unsigned int cpu = smp_processor_id();struct stack *stk = &stacks[cpu];__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[0])),PLC (PSR_F_BIT | PSR_I_BIT | ABT_MODE),"I" (offsetof(struct stack, abt[0])),PLC (PSR_F_BIT | PSR_I_BIT | UND_MODE),"I" (offsetof(struct stack, und[0])),PLC (PSR_F_BIT | PSR_I_BIT | SVC_MODE): "r14");}[/c] 

可以看到,Linux为IRQ\ABT\UND3种模式的SP寄存器指定了相应的栈,但是这个栈很小很小,只有12个字节。但这已经足够了,在中断处理最初那部分相应模式的代码vector_XXX中,linux只保存r0, lr和spsr三个32位的数据,这正好需要12个字节。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top