就我understand而言,操作系统通常参与管理堆及其簿记。例如,用户程序的过程需要调用系统调用才能从堆中分配和取消分配内存。
如何处理stack?据我所知:
以上我的理解正确吗?
更广泛地讲,运行时操作中操作系统是否以某种方式涉及堆栈? (例如弹出并推入新的堆栈框架,它们的组织结构等),如果可以,如何执行?
或者操作系统仅涉及提前分配整个任务/线程/进程的堆栈内存吗?
这给我(可能是错误的)印象,用户程序可以直接编译为汇编代码,以执行不涉及操作系统的堆栈推入/弹出CPU指令
实际上是正确的。
我理解必须在用户程序尝试使用堆栈时(例如,推动和弹出调用堆栈框架等)知道并参与其中。
不是。操作系统不需要参与堆栈中的every single推入/弹出操作或任何其他类型的读/写操作,实际上不是这样。如果您考虑一下,那么在每次访问单个堆栈时都要求操作系统进行干预将非常缓慢且适得其反。
操作系统是否以任何方式参与了涉及堆栈的运行时操作? (例如弹出并推入新的堆栈框架,它们的组织等),如果是,如何?
不,不是。管理堆栈是拥有堆栈的过程的职责。
如果堆栈操作是直接从编译后的汇编代码在CPU级别完成的,则操作系统可能仅在程序启动时才“描绘”了堆栈的虚拟地址范围?
是的,确切地说,您要到达那里。
创建新进程时,内核将为堆栈保留空间,并且还将在堆栈的最底部复制一些数据,例如命令行参数。所有这些操作都在before开始执行。
堆栈操作(例如,push和pop,这是最简单的操作),直接由CPU完成。换句话说,push和pop这样的指令是直接执行。
操作系统仅在必要时进行某些干预。一个(非详尽的)列表: