首页 > 解决方案 > 操作系统参与堆栈操作

问题描述

据我了解,操作系统经常参与管理堆及其簿记。例如,用户程序的进程需要调用系统调用才能从堆中分配和取消分配内存。

这对堆栈有什么作用?据我所知:

我上面的理解正确吗?

更广泛地说,操作系统是否以任何方式参与涉及堆栈的运行时操作?(例如弹出和推送新的堆栈帧,它们的组织等),如果是这样,如何?

还是操作系统只参与提前分配整个任务/线程/进程的堆栈内存?

标签: memory-managementlinux-kerneloperating-systemstack

解决方案


这给我一种(可能是错误的)印象,即用户程序可以直接编译为汇编代码以执行不以任何方式涉及操作系统的堆栈推送/弹出 CPU 指令

确实是这样。

我知道它必须知道并在用户程序尝试使用堆栈时参与其中(例如,推送和弹出调用堆栈帧等)。

并不真地。操作系统不需要参与堆栈上的每一个推送/弹出或任何其他类型的读/写操作,事实上它不是。如果您考虑一下,在每次堆栈访问时请求操作系统干预将非常缓慢且适得其反。

操作系统是否以任何方式参与涉及堆栈的运行时操作?(例如弹出和推送新的堆栈帧,它们的组织等),如果是这样,如何?

不,不是。管理堆栈是拥有它的进程的职责。

如果堆栈操作是直接在 CPU 级别从编译的汇编代码完成的,那么操作系统可能只在程序启动时参与“描绘”堆栈的虚拟地址范围?

是的,确切地说,你正在到达那里。

当一个新进程被创建时,内核会为栈保留空间,并且它也会在栈的最底部复制一些数据,比如命令行参数。所有这些都是开始该过程之前完成的。

堆栈操作(例如最简单的 push 和 pop)直接由 CPU 完成。也就是说,直接执行push 和 pop 之类的指令。

操作系统仅在必要时在某些情况下进行干预。一个(非详尽的)列表:

  • 当一条指令(例如推送)导致进程读取或写入超出堆栈末尾时,CPU 会生成异常。操作系统(在启动时注册了一个异常处理程序)捕获此异常并根据需要进行处理。通常这会导致尽可能增加堆栈大小,否则会终止进程。然后恢复用户进程,就好像什么都没发生一样。
  • 当进行系统调用时,操作系统将所有用户寄存器临时保存到堆栈中,然后执行其处理系统调用的工作,然后恢复所有内容。
  • 当一个信号被传递给一个进程,并且该进程注册了一个信号处理程序时,同样的事情会发生:寄存器被保存到堆栈中,然后使用正确的参数调用信号处理程序,当它返回时恢复之前的状态并该过程继续。

推荐阅读