【问题标题】:How is the stack pointer used in vector_swi() in arm linux system call initialised?arm linux系统调用中vector_swi()中使用的堆栈指针是如何初始化的?
【发布时间】:2018-10-02 05:46:14
【问题描述】:

在阅读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) 寄存器?

它如何知道内核栈的地址? 这个内核栈和进程(调用系统调用的进程)的内核栈一样吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。如果您还可以显示将 svc 模式 r13 设置为内核堆栈的代码,那就太好了。
    • 对于arm,在arch/arm/kernel/process.c中的copy_thread()中,thread->cpu_context.sp被初始化为正在创建的线程。物理上,当调度程序确实切换到新线程时,此值进入 SVC 模式 R13 - 在 arch/arm/kernel/entry-*.S 中的 __switch_to() 中
    猜你喜欢
    • 2012-08-23
    • 1970-01-01
    • 2014-05-20
    • 2012-07-21
    • 2021-11-28
    • 2017-09-24
    • 2016-11-09
    • 2011-10-26
    • 1970-01-01
    相关资源
    最近更新 更多