arm的内核栈地址保存在哪里?
arm的内核栈地址保存在哪里?是不是也象x86那样有个类似tss的东东保存内核栈地址 这种问题看看 entry.S 就可以自己得出答案了
值得注意的是, arm64 架构可以配置为不同的 EL 使用各自的栈。
所以 kernel 完全可以不保存栈,切入内核直接使用内核的 sp_el1,切入用户使用 sp_el0. arm使用sp保存堆栈指针,arm64支持4种异常模式el0~el3,el0对应用户模式,el1对应内核模式,每个异常模式可以有自己的sp: sp_el0~sp_el3;
也可以设置PSTATE.SP位,所有异常模式统一使用sp_el0;
补充个__switch_data代码,启动过程sp指向init_task栈地址:
__switch_data:
.quad __mmap_switched
.quad __bss_start // x6
.quad __bss_stop // x7
... ...
.quad init_thread_union + THREAD_START_SP // sp
__mmap_switched:
// clear bss
ldr x16,
mov sp, x16
... ...
b start_kernel
页:
[1]