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

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

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

相关文章:

linux - 如何测量 Linux 中 OpenMP 代码的内存使用情况?

linux - ARM 的内核 Oops 页面错误错误代码

c - linux-kernel 模块分配的最大内存

c - 从 FAT12 查找可用软盘空间

windows - C++ try-catch block 无法捕获硬件异常

linux - BASH 对话框 动态菜单

C++ ofstream 写入在 Windows 下不起作用。在 Linux 下工作正常

linux - 将/proc/sys/vm/drop_caches重置为默认值0

非阻塞系统调用可以中断吗?

c++ - 如何在 C++ 中读取系统信息?