【发布时间】:2017-01-25 14:47:51
【问题描述】:
我对微控制器的实时操作系统非常感兴趣,因此我正在对该主题进行深入研究。在高层次上,我了解操作系统的所有一般机制。
为了更好地学习它,我决定编写一个非常简单的内核,它只做上下文切换。这给我提出了很多额外的实际问题。我能够应付其中的许多问题,但我仍然对主要问题存有疑问 - 保存当前任务的上下文(所有 CPU 寄存器和堆栈指针)并恢复新任务的上下文。
一般来说,操作系统使用一些函数(比如 OSContextSwitch()) 来保留上下文切换的所有操作。 OSContextSwitch()的主体主要是用汇编编写的(C体函数中的内联汇编)。但是,当调度程序调用 OSContextSwitch() 时,据我所知,在函数调用中,编译器会在堆栈中保留一些 CPU 寄存器(实际上是由编译器)。
最后,问题是:如何知道编译器已经将哪些 CPU 寄存器保存到堆栈中,以便我可以保留其余的?如果我保留所有寄存器而不考虑编译器行为,显然会有一些堆栈泄漏。
【问题讨论】:
-
这对我来说并不明显。如果您正在编写代码以将内容推送到堆栈上,那么您是否也在编写代码以将这些内容从堆栈中弹出?因此,只要您弹出您推送的所有内容,那么您应该没问题。如果您推送/弹出不必要的东西,这有什么关系? (或者,“堆栈泄漏”是什么意思?)