【问题标题】:How does the stack pointer work in several processes?堆栈指针如何在多个进程中工作?
【发布时间】:2018-04-08 16:01:39
【问题描述】:

正如我之前所理解的,每个进程都有自己的地址空间,称为虚拟地址空间或程序内存, 每个进程都有一个称为堆栈的位置,用于存储函数的局部变量和参数。

此外,当异常发生时,处理器(例如 ARM cortex-A)切换到特权模式,然后分支到异常处理程序。

据我了解,大部分应用都是在非特权用户模式下运行的,这种模式有一个特殊的寄存器叫做栈指针,用来保存栈顶的地址;但这是一个单独的寄存器,实际上不能同时保存多个进程的栈顶地址。请您解释一下实际发生的情况?

【问题讨论】:

    标签: arm stack cortex-a


    【解决方案1】:

    对于所有寄存器,一旦操作系统决定是时候运行另一个进程(“上下文切换”),它就会被保存并存放在与进程关联的数据结构中;就好像它拍摄了当前处理器状态的快照。

    当进程再次被调度时,所有的寄存器都被恢复(包括指令指针),并继续执行,就像什么都没发生一样。

    据我了解,大部分应用都是在非特权用户模式下运行的,这种模式有一个特殊的寄存器叫做栈指针,用来保存栈顶的地址

    堆栈指针不是特定于用户模式的,处理器总是拥有(并且可以使用)它,无论模式如何。

    【讨论】:

    • 那么拍摄的快照到底保存在进程的内存布局中的什么位置?
    • 取决于操作系统;通常,每个多任务操作系统都有一些“可调度实体”内核端结构,这些数据存储在其中(以及其他与任务相关的数据)。
    • 现在,看看 Linux 中的确切实现,它有点复杂 - 一部分保存在任务结构中,一部分保存在暂停任务的堆栈中。
    • 在 Linux 中,每个任务都有一个主管堆栈。该堆栈包含一个“thread_info”和用户寄存器(包括堆栈指针)。超级堆栈为 8K(或两个 mmu 页)。所有 Linux 故障(中断、内存、对齐等)都切换到此管理程序堆栈。当内核任务切换时,“super sp”被交换,然后是 MMU 视图。这些 8k 页面的所有任务都有一个列表(可能是几个,也可能是树)。 'thread_info' 有一个指向完整进程信息的指针。超级堆栈还维护内核函数之间的调用信息(就像用户空间一样)。
    • 也许有帮助,ARM kernel exception stackARM TLSARM interrupts and context saving 等。ARM Linux 内核并不是唯一的。大多数操作系统会在这方面使用变体,但可能会影响性能、内存占用和功能。
    猜你喜欢
    • 1970-01-01
    • 2013-06-30
    • 2015-11-16
    • 2023-03-15
    • 2013-01-20
    • 2020-09-29
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多