在arm linux系统调用的vector_swi()中​​使用的堆栈指针如何初始化?

时间:2018-10-02 05:46:15

标签: linux linux-kernel operating-system arm system-calls

在阅读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)寄存器的设置方式如何?

它如何知道内核堆栈的地址? 这个内核堆栈与进程的(称为系统调用的进程)内核堆栈相同吗?

1 个答案:

答案 0 :(得分:3)

在arm32架构上,sp(r13)被存储,这意味着USR和SVC模式在物理上是分开的寄存器。

对于每个用户空间线程,相应的内核线程始终存在,并为其分配堆栈,并且SVC模式r13指向该线程。在进入系统调用时,软件可见的r13会切换到SVC模式的r13,然后您要指向的指令就会执行。