在阅读vector_swi()
例程以进行arm linux系统调用时,我发现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_svc
)的sp寄存器指向内核堆栈。 r0-r12寄存器被复制到内核堆栈。
我的问题是sp(sp_svc
)寄存器的设置方式如何?
它如何知道内核堆栈的地址? 这个内核堆栈与进程的(称为系统调用的进程)内核堆栈相同吗?
答案 0 :(得分:3)
在arm32架构上,sp(r13)被存储,这意味着USR和SVC模式在物理上是分开的寄存器。
对于每个用户空间线程,相应的内核线程始终存在,并为其分配堆栈,并且SVC模式r13指向该线程。在进入系统调用时,软件可见的r13会切换到SVC模式的r13,然后您要指向的指令就会执行。