请教arm linux内核态堆栈的一个小问题

gjq_1988 2014-09-21 05:21:17
linux进程在系统调用发生的时候,会从用户态切换到内核态,此时堆栈也要切换到对应进程的内核态堆栈

在x86平台下,进程的内核态堆栈指针是保存在tss中的,由cpu完成堆栈切换linux kernel只使用了一个tss段,每次进程切换的时候将对应进程的内核态堆栈指针保存在这个tss段中,这样,这个进程就能在被中断的时候,切换到自己的内核态堆栈。

而在arm平台下,没有tss这一说,arm平台下,一个进程被中断的时候,arm会进入异常模式,切换为异常模式下的sp,那么这个sp是在什么时候被初始化为对应进程的内核态堆栈指针的呢
...全文
405 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
abcde1120 2018-10-13
  • 打赏
  • 举报
回复
SVC模式的SP寄存器存的就是当前任务的内核态栈指针。SVC的SP寄存器只在任务切换的时候被改变,所以它就是当前运行任务的内核栈指针。
Heaven_Redsky 2014-09-27
  • 打赏
  • 举报
回复
mark下,LZ尽快找到答案哈。
lr2131 2014-09-25
  • 打赏
  • 举报
回复
如果跑Linux、WinCE这类使用MMU的OS,什么时候初始化内核态堆栈指针,这个我不知道。 去看看bootloader和Linux内核源码吧。
gjq_1988 2014-09-24
  • 打赏
  • 举报
回复
引用 1 楼 lr2131 的回复:
X86的我不太清楚。ARM平台下,不同版本的ARM做法不同。 ARMv4和ARMv5版本的,在用户模式和各个异常模式(包括内核模式),都有各自的模式下的一套寄存器,也就是back寄存器,SP也在其中。切换模式后,SP自动切换到对应模式下。一般SP在启动时通过MSR和MRS来读写访问,初始化SP也是在启动后不久就应该完成,因为后面如果调用C函数和发生中断,SP必须就位。 ARMv6和ARMv7版本的,把ARMv4/v5的模式精简了很多,直接是双堆栈指针主堆栈MSP和线程堆栈PSP,可以认为是内核堆栈指针和用户堆栈指针。这里说的都是ARMv6-M和ARMv7-M的,ARMv6-A和ARMv7-A相对复杂。MSP是在启动的时候,系统自动从启动代码的最前面4字节取出放到MSP中,这个动作是不需要指令完成的,硬件自动完成,除非软跳转。目的是为了在系统运行起来就能相应各种中断,包括NMI这种中断。PSP是在后面通过指令初始化的。以上细节可以参考《Cortex-M3权威指南》。
你好,不同进程的内核态堆栈明显是不同的,必须在运行的过程中,随着进程的改变而不断动态切换,不是只在启动时初始化就行的。我问的就是:arm 平台下,当某一个进程切换到内核态的时候,就会切换到异常模式下的SP,那这个sp是何时被初始化为对应进程的内核态堆栈指针的?,这和启动时SP的初始化无关。
lr2131 2014-09-24
  • 打赏
  • 举报
回复
X86的我不太清楚。ARM平台下,不同版本的ARM做法不同。 ARMv4和ARMv5版本的,在用户模式和各个异常模式(包括内核模式),都有各自的模式下的一套寄存器,也就是back寄存器,SP也在其中。切换模式后,SP自动切换到对应模式下。一般SP在启动时通过MSR和MRS来读写访问,初始化SP也是在启动后不久就应该完成,因为后面如果调用C函数和发生中断,SP必须就位。 ARMv6和ARMv7版本的,把ARMv4/v5的模式精简了很多,直接是双堆栈指针主堆栈MSP和线程堆栈PSP,可以认为是内核堆栈指针和用户堆栈指针。这里说的都是ARMv6-M和ARMv7-M的,ARMv6-A和ARMv7-A相对复杂。MSP是在启动的时候,系统自动从启动代码的最前面4字节取出放到MSP中,这个动作是不需要指令完成的,硬件自动完成,除非软跳转。目的是为了在系统运行起来就能相应各种中断,包括NMI这种中断。PSP是在后面通过指令初始化的。以上细节可以参考《Cortex-M3权威指南》。

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧