【发布时间】:2016-06-01 06:47:42
【问题描述】:
我知道堆栈大小可以通过限制工具来控制,但是内核如何强制执行其中一些限制,例如 RLIMIT_STACK?由于linux不涉及栈操作(只是一个mov或push指令),那么超过限制时内核如何发出SIGSEGV?我知道对于虚拟寻址,CPU 提供了 linux 内核可以使用的工具。这是否类似于强制执行堆栈大小限制的方式?或者 linux 是否会在“犯罪发生后”对堆栈大小进行例行检查并发出段错误?还是有第三种选择?
【问题讨论】:
我知道堆栈大小可以通过限制工具来控制,但是内核如何强制执行其中一些限制,例如 RLIMIT_STACK?由于linux不涉及栈操作(只是一个mov或push指令),那么超过限制时内核如何发出SIGSEGV?我知道对于虚拟寻址,CPU 提供了 linux 内核可以使用的工具。这是否类似于强制执行堆栈大小限制的方式?或者 linux 是否会在“犯罪发生后”对堆栈大小进行例行检查并发出段错误?还是有第三种选择?
【问题讨论】:
由于虚拟内存,内核可以控制这一点。虚拟内存(也称为内存映射)基本上是虚拟内存区域(基数+大小)和内核可以操作的目标物理内存区域的列表,每个程序都是唯一的。当程序尝试访问不在此列表中的地址时,会发生异常。此异常将导致上下文切换到内核模式。内核可以查找故障。如果内存要变得有效,它将在程序继续运行之前就位(例如,swap 和 mmap 尚未从磁盘读取)或者可以生成 SEGFAULT。
为了决定堆栈大小限制,内核简单地操作虚拟内存映射。
【讨论】: