CPU 如何处理操作系统中特定任务的堆栈溢出

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

我知道我要问的问题取决于平台类型和操作系统本身。

我很难理解操作系统通常如何管理不同任务的不同堆栈空间。

假设我们初始化一个包含许多不同任务的操作系统,并为每个任务指定堆栈大小。当任务运行时,数据被推入堆栈并达到该任务允许的堆栈空间大小的限制。

如果我错了,请纠正我,因为此时操作系统尚未运行,异常必须首先来自CPU,这最终会导致操作系统重新获得控制权。然后它可以以任何方式管理内存

当超出特定任务的堆栈限制时,CPU 如何生成异常?对于每个任务来说,这将是不同的值。它必须有可比较的值吗?

exception operating-system stack stack-overflow interrupt
1个回答
0
投票

它是通过虚拟内存机制来完成的。

每个程序都有自己的页表(由操作系统准备),它将虚拟地址映射到物理地址。每次程序访问内存时,CPU都会检查该表。页表中的某些条目可以标记为“不存在”。当遇到这样的页面时,CPU会触发中断/异常并跳转到OS代码。

操作系统可以有目的地将某些页面标记为“不存在”,以检测程序何时访问它们 - 这个概念称为“保护页面”。操作系统用保护页包围堆栈。当程序触及此类页面时 - 操作系统获得控制权。如果它发现页面靠近堆栈 - 它将其视为堆栈溢出。

请注意,这种机制并不完全万无一失——保护页的数量有限。如果一次堆栈溢出太多 - 可能会跳过所有保护页并进入堆,并且操作系统无法阻止这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.