在阅读arm linux系统调用的vector_swi()
例程时,发现r0-r12寄存器被复制到内核栈中(下面是代码)
ENTRY(vector_swi)
#ifdef CONFIG_CPU_V7M
v7m_exception_entry
#else
sub sp, sp, #S_FRAME_SIZE
stmia sp, {r0 - r12} @ Calling r0 - r12
据我了解,在系统调用期间,arm 进入 svc 模式并跳转到 vector_swi()
例程并开始执行。 svc模式的sp寄存器(sp_svc
)指向内核栈。 r0-r12 寄存器被复制到内核堆栈。
我的问题是 sp (sp_svc
) 寄存器设置如何?
它是怎么知道内核栈地址的? 这个内核栈和进程(调用系统调用的进程)的内核栈一样吗?
最佳答案
在 arm32 架构上,sp (r13) 是存储的,这意味着 USR 和 SVC 模式在物理上是分开的寄存器。
对于每个用户空间线程,相应的内核线程总是存在的,并且分配了它的堆栈并且 SVC 模式 r13 指向那里。在系统调用入口处,软件可见的r13被切换到SVC模式的r13,之后执行你指向的指令。
关于linux - arm linux 系统调用中 vector_swi() 中使用的堆栈指针是如何初始化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52602624/