堆栈指针如何在多个进程中工作?
Posted
技术标签:
【中文标题】堆栈指针如何在多个进程中工作?【英文标题】:How does the stack pointer work in several processes? 【发布时间】:2018-04-08 16:01:39 【问题描述】:正如我之前所理解的,每个进程都有自己的地址空间,称为虚拟地址空间或程序内存, 每个进程都有一个称为堆栈的位置,用于存储函数的局部变量和参数。
此外,当异常发生时,处理器(例如 ARM cortex-A)切换到特权模式,然后分支到异常处理程序。
据我了解,大部分应用都是在非特权用户模式下运行的,这种模式有一个特殊的寄存器叫做栈指针,用来保存栈顶的地址;但这是一个单独的寄存器,实际上不能同时保存多个进程的栈顶地址。请您解释一下实际发生的情况?
【问题讨论】:
【参考方案1】:对于所有寄存器,一旦操作系统决定是时候运行另一个进程(“上下文切换”),它就会被保存并存放在与进程关联的数据结构中;就好像它拍摄了当前处理器状态的快照。
当进程再次被调度时,所有的寄存器都被恢复(包括指令指针),并继续执行,就像什么都没发生一样。
据我了解,大部分应用都是在非特权用户模式下运行的,这种模式有一个特殊的寄存器叫做栈指针,用来保存栈顶的地址
堆栈指针不是特定于用户模式的,处理器总是拥有(并且可以使用)它,无论模式如何。
【讨论】:
那么拍摄的快照到底保存在进程的内存布局中的什么位置? 取决于操作系统;通常,每个多任务操作系统都有一些“可调度实体”内核端结构,这些数据存储在其中(以及其他与任务相关的数据)。 现在,看看 Linux 中的确切实现,它有点复杂 - 一部分保存在任务结构中,一部分保存在暂停任务的堆栈中。 在 Linux 中,每个任务都有一个主管堆栈。该堆栈包含一个“thread_info”和用户寄存器(包括堆栈指针)。超级堆栈为 8K(或两个 mmu 页)。所有 Linux 故障(中断、内存、对齐等)都切换到此管理程序堆栈。当内核任务切换时,“super sp”被交换,然后是 MMU 视图。这些 8k 页面的所有任务都有一个列表(可能是几个,也可能是树)。 'thread_info' 有一个指向完整进程信息的指针。超级堆栈还维护内核函数之间的调用信息(就像用户空间一样)。 也许有帮助,ARM kernel exception stack、ARM TLS、ARM interrupts and context saving 等。ARM Linux 内核并不是唯一的。大多数操作系统会在这方面使用变体,但可能会影响性能、内存占用和功能。以上是关于堆栈指针如何在多个进程中工作?的主要内容,如果未能解决你的问题,请参考以下文章