OS参与堆栈操作

问题描述 投票:0回答:1

就我understand而言,操作系统通常参与管理堆及其簿记。例如,用户程序的过程需要调用系统调用才能从堆中分配和取消分配内存。

如何处理stack?据我所知:

  • CPU处理器提供推入和弹出指令以从堆栈中添加/删除项目。这给我(可能是错误的)印象,即用户程序可以直接编译为汇编代码以执行不以任何方式涉及操作系统的堆栈推入/弹出CPU指令
  • 操作系统监督堆栈存储器,至少限制了它的大小,所以我理解它必须在用户程序尝试使用堆栈时(例如,推和弹出调用堆栈帧等)知道并参与其中。 )。

以上我的理解正确吗?

更广泛地讲,运行时操作中操作系统是否以某种方式涉及堆栈? (例如弹出并推入新的堆栈框架,它们的组织结构等),如果可以,如何执行?

或者操作系统仅涉及提前分配整个任务/线程/进程的堆栈内存吗?

memory-management linux-kernel operating-system stack
1个回答
1
投票

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

实际上是正确的。

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

不是。操作系统不需要参与堆栈中的every single推入/弹出操作或任何其他类型的读/写操作,实际上不是这样。如果您考虑一下,那么在每次访问单个堆栈时都要求操作系统进行干预将非常缓慢且适得其反。

操作系统是否以任何方式参与了涉及堆栈的运行时操作? (例如弹出并推入新的堆栈框架,它们的组织等),如果是,如何?

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

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

是的,确切地说,您要到达那里。

创建新进程时,内核将为堆栈保留空间,并且还将在堆栈的最底部复制一些数据,例如命令行参数。所有这些操作都在before开始执行。

堆栈操作(例如,push和pop,这是最简单的操作),直接由CPU完成。换句话说,push和pop这样的指令是直接执行

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

  • [当指令(例如,推入)使进程读取或写入堆栈的末尾时,CPU会生成异常。操作系统(在启动时注册了异常处理程序)会捕获此异常并根据需要进行处理。通常,如果可能的话,这会导致堆栈大小增加,否则会终止进程。然后,就像没有任何反应一样,恢复用户进程。
  • [进行系统调用时,操作系统会暂时将所有用户寄存器保存到堆栈中,然后执行其工作以处理系统调用,然后恢复所有内容。
  • [当信号传递到进程,并且进程注册了信号处理程序时,会发生相同的事情:将寄存器保存到堆栈中,然后使用正确的参数调用信号处理程序,并在返回前一状态时返回恢复,过程恢复。
© www.soinside.com 2019 - 2024. All rights reserved.