gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:44:04 25 4
gpt4 key购买 nike

在阅读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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com