我知道堆栈大小可以通过限制工具进行控制,但是内核如何强制执行其中一些限制,例如 RLIMIT_STACK?由于linux不涉及堆栈操作(只是mov或push指令),那么当超出限制时内核如何发出SIGSEGV?据我了解,对于虚拟寻址,CPU 提供了 Linux 内核可以使用的设施。这是否类似于堆栈大小限制的强制执行方式?或者 Linux 是否会对堆栈大小执行例行检查并在“犯罪发生后”发出段错误?或者还有第三种选择吗?
由于虚拟内存,内核可以控制这一点。虚拟内存(也称为内存映射)基本上是虚拟内存区域(基址 + 大小)的列表和内核可以操作的目标物理内存区域,该区域对于每个程序都是唯一的。当程序尝试访问不在此列表中的地址时,就会发生异常。此异常将导致上下文切换到内核模式。内核可以查找故障。如果内存要变得有效,它将在程序继续之前就位(例如尚未从磁盘读取交换和 mmap)或生成 SEGFAULT。
为了决定堆栈大小限制,内核只需操作虚拟内存映射。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)