linux 内核如何强制执行堆栈大小限制?

how does the linux kernel enforce stack size limits?

我知道堆栈大小可以通过限制工具来控制,但是内核如何强制执行其中的一些限制,例如 RLIMIT_STACK?由于linux不涉及堆栈操作(它只是一个mov或push指令),当你超过限制时内核如何发出SIGSEGV?我知道对于虚拟寻址,CPU 提供了 linux 内核可以使用的工具。这是否类似于堆栈大小限制的强制执行方式?还是 linux 对堆栈大小执行例行检查并发出段错误 'after the crime has occurred'?还是有第三种选择?

由于虚拟内存,内核可以控制这一点。虚拟内存(也称为内存映射)基本上是一个虚拟内存区域列表(基础+大小)和内核可以操作的目标物理内存区域,每个程序都是唯一的。当程序试图访问不在此列表中的地址时,就会发生异常。此异常将导致上下文切换到内核模式。内核可以查找故障。如果内存要变为有效,它将在程序可以继续之前就位(例如交换和 mmap 尚未从磁盘读取)或者可以生成 SEGFAULT。

为了决定堆栈大小限制,内核简单地操作虚拟内存映射。