EL1配置为何需设置栈指针?EL2与EL1重复设置的必要性
关于ARM从EL3切到EL1时两次设置栈指针的问题
EL2里为啥要设sp_el1?
ARM不同异常级别切换时,目标级别对应的栈指针寄存器得提前配置好。从EL2切到EL1的时候,CPU默认会用sp_el1作为EL1的栈指针。要是EL2里不给sp_el1设个合法的栈地址,进EL1后栈指针就是乱码,后续不管是保存寄存器还是处理中断,一用到栈就直接崩溃。这段代码在EL2设置sp_el1,本质是提前给EL1铺好能用的栈空间,确保切换过去就能正常执行操作。
进EL1后为啥还要再设一遍栈指针?
进EL1之后,代码可能会切换栈指针模式(比如从SP_EL1改成用EL0的SP_0),或者得给EL1的裸机程序单独配置专属栈——比如更大的空间、加了栈保护的栈。另外,触发EL1的IRQ中断时,CPU会自动切换到sp_el1(只要SPSR_EL1的SP位是1),要是进EL1后不确认/重设栈指针,要么栈空间不够用,要么和其他内存空间重叠,中断处理过程肯定出问题。
为啥删任意一处栈指针赋值,中断就没响应?
- 要是删了EL2里的
sp_el1设置:进EL1时栈指针是未初始化的垃圾值,连EL1的环境初始化(比如保存寄存器、设置中断向量表)都完不成,根本到不了触发中断的步骤。 - 要是删了EL1里的栈指针设置:虽说EL2已经给
sp_el1设了值,但EL1后续的中断处理可能依赖当前模式的栈指针(比如SP_0),或者需要更大的栈空间,这时候栈要么非法要么容量不足,中断处理时会出现栈溢出、寄存器保存失败的情况,最后系统直接瘫掉,自然没响应。
内容的提问来源于stack exchange,提问作者Angel Ruiz
相关产品推荐
相关产品推荐

