我知道栈的大小可以通过限制设施来控制,但是内核是如何强制执行这些限制的,比如RLIMIT_STACK? 由于linux不涉及堆栈操作(它只是一个mov或push指令),当超出限制时,内核如何发出SIGSEGV? 我明白,对于虚拟寻址,CPU提供了一个linux内核可以使用的工具。 这与堆栈大小限制如何执行相似吗? 还是linux执行堆栈大小的例行检查并在犯罪发生后发出segfaults? 还是有第三个select?
内核可以控制这个由于虚拟内存。 虚拟内存(也称为内存映射)基本上是虚拟内存区域(基本大小)和内核可以操作的目标物理内存区域的列表,每个程序都是唯一的。 当程序尝试访问不在此列表中的地址时,会发生异常。 这个异常将导致上下文切换到内核模式。 内核可以查找错误。 如果内存变得有效,它将在程序继续之前被放置到位(例如swap和mmap不能从磁盘读取)或者可以生成SEGFAULT。
为了决定堆栈大小的限制,内核只是简单地操作虚拟内存映射。